Comment puis-je calculer la racine carrée d'un Float
en C#
, similaire à Core.Sqrt
dans XNA?Comment calculer la racine carrée d'un flotteur en C#
Répondre
Calculez-le pour double
, puis repoussez pour flotter. Peut être un peu lent, mais devrait fonctionner.
(float)Math.Sqrt(inputFloat)
ne lâchez pas la précision? – Chris
J'ai toujours espéré que, d'une certaine façon, .Net l'optimiserait pour être une opération entièrement flottante (toutes les 32 bits) dans les coulisses. Est-ce que quelqu'un sait si cela est optimisé? – Detmar
@Chris, la précision sera la même que l'entrée. Le calcul est fait en utilisant des doubles. –
Je déteste dire cela, mais 0x5f3759df semble prendre 3x aussi longtemps que Math.sqrt. Je viens de faire quelques tests avec des minuteurs. Math.Sqrt dans une boucle d'accès à des matrices précalculées a abouti à environ 80ms. 0x5f3759df dans les mêmes circonstances a abouti à 180 + ms
Le test a été effectué plusieurs fois en utilisant les optimisations de mode de libération.
Source ci-dessous:
/*
================
SquareRootFloat
================
*/
unsafe static void SquareRootFloat(ref float number, out float result)
{
long i;
float x, y;
const float f = 1.5F;
x = number * 0.5F;
y = number;
i = *(long*)&y;
i = 0x5f3759df - (i >> 1);
y = *(float*)&i;
y = y * (f - (x * y * y));
y = y * (f - (x * y * y));
result = number * y;
}
/*
================
SquareRootFloat
================
*/
unsafe static float SquareRootFloat(float number)
{
long i;
float x, y;
const float f = 1.5F;
x = number * 0.5F;
y = number;
i = *(long*)&y;
i = 0x5f3759df - (i >> 1);
y = *(float*)&i;
y = y * (f - (x * y * y));
y = y * (f - (x * y * y));
return number * y;
}
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
int Cycles = 10000000;
Random rnd = new Random();
float[] Values = new float[Cycles];
for (int i = 0; i < Cycles; i++)
Values[i] = (float)(rnd.NextDouble() * 10000.0);
TimeSpan SqrtTime;
float[] Results = new float[Cycles];
DateTime Start = DateTime.Now;
for (int i = 0; i < Cycles; i++)
{
SquareRootFloat(ref Values[i], out Results[i]);
//Results[i] = (float)Math.Sqrt((float)Values[i]);
//Results[i] = SquareRootFloat(Values[i]);
}
DateTime End = DateTime.Now;
SqrtTime = End - Start;
Console.WriteLine("Sqrt was " + SqrtTime.TotalMilliseconds.ToString() + " long");
Console.ReadKey();
}
}
Pour être honnête, cela semble assez hors-sujet, mais c'est quand même intéressant! – Tara
http://stackoverflow.com/questions/268853/is-it-possible-to-write-quakes-fast-invsqrt-function-in-c? –
private double operand1;
private void squareRoot_Click(object sender, EventArgs e)
{
operand1 = Math.Sqrt(operand1);
this.textBox1.Text = operand1.ToString();
}
Bienvenue dans Stack Overflow! Bien que cette réponse soit probablement correcte et utile, il est préférable que vous [incluiez quelques explications avec elle] (http://meta.stackexchange.com/q/114762/159034) pour expliquer comment cela aide à résoudre le problème. Cela devient particulièrement utile à l'avenir, s'il y a un changement (peut-être non apparenté) qui le fait cesser de fonctionner et les utilisateurs ont besoin de comprendre comment il a déjà fonctionné. –
- 1. Recherche binaire pour calculer la racine carrée (Java)
- 2. La racine carrée dans PHP
- 3. Déterminer la racine carrée d'un nombre
- 4. Comment faire la racine carrée dans PowerPoint VBA?
- 5. racine carrée pour Bigint en F #
- 6. Prenez racine carrée dans Mathematica
- 7. inverse racine carrée: dans une lib Math ou comment le calculer
- 8. OpenCV: Accéder et prendre la racine carrée des pixels
- 9. Comment faire une racine carrée sans utiliser de module mathématique?
- 10. La fonction de racine carrée dans Forth utilisant x86 Assemblée?
- 11. Représentation du flotteur en C
- 12. HTML, CSS: barre supérieure correspondant symbole racine carrée
- 13. Comment calculer la puissance en C#?
- 14. Créer une fenêtre carrée C++
- 15. Comment comparer la corde avec le flotteur? en Objective C
- 16. Calculer la médiane en C#
- 17. comment transposez-vous une matrice non-carrée? en C
- 18. C#: Convertir tableau d'octets en un flotteur
- 19. C# flotteur boucle infinie
- 20. Passer le flotteur "byref" en Objective C?
- 21. Calculer la période en utilisant C
- 22. premiers 64 bits de la partie fractionnaire de la racine carrée de 2
- 23. Création d'une onde sinusoïdale ou carrée en C#
- 24. Comment calculer sha1sum d'un fichier en C++?
- 25. Existe-t-il des bibliothèques pour la racine carrée sur BigDecimal?
- 26. Faire une image carrée
- 27. Comment calculer la bande passante en utilisant C#
- 28. Flotteur arrondi en Ruby
- 29. Déclarez le flotteur ou le flotteur moulé?
- 30. Comment convertir un flotteur en fraction?
Utilisez la magie puissante - [0x5f3759df] (http://www.codemaestro.com/reviews/9) – jball
que la magie est la racine carrée inverse. Mais une magie similaire existe pour sqrt. Et cela perd de la précision. – CodesInChaos
@CodeInChaos - le deuxième exemple de code dans l'article a une implémentation pour sqrt: * "Notez que la seule vraie différence est dans la valeur de retour - au lieu de renvoyer y, renvoyez le nombre * y comme racine carrée" * – jball