¿Cómo puedo calcular la raíz cuadrada de Float
en C#
, similar a Core.Sqrt
en XNA?Cómo calcular la raíz cuadrada de un flotador en C#
Respuesta
Cómprelo para double
y luego vuélvalo a flotar. Puede ser un poco lento, pero debería funcionar.
(float)Math.Sqrt(inputFloat)
¿no pierde la precisión? – Chris
Siempre he esperado que de alguna manera .Net optimizara esto para que fuera una operación totalmente flotante (todo de 32 bits) detrás de escena. ¿Alguien sabe si esto se optimiza? – Detmar
@Chris, la precisión será la misma que la de entrada. El cálculo se hace usando dobles. –
odio decir esto, pero parece 0x5f3759df tomar 3 veces el tiempo que Math.Sqrt. Acabo de hacer algunas pruebas con temporizadores. Math.Sqrt en un for-loop que accede a arreglos precalculados dio como resultado aproximadamente 80 ms. 0x5f3759df en las mismas circunstancias resultó en 180 + ms
La prueba se realizó varias veces utilizando las optimizaciones del modo de lanzamiento.
Fuente continuación:
/*
================
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();
}
}
Para ser sincero, esto parece bastante fuera de tema, ¡pero de todos modos es interesante! – 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();
}
¡Bienvenido a Stack Overflow! Si bien esta respuesta es probablemente correcta y útil, se prefiere si [incluye alguna explicación junto con ella] (http://meta.stackexchange.com/q/114762/159034) para explicar cómo ayuda a resolver el problema. Esto se vuelve especialmente útil en el futuro, si hay un cambio (posiblemente no relacionado) que hace que deje de funcionar y los usuarios deben comprender cómo funcionó. –
- 1. Cómo calcular la raíz cuadrada en python?
- 2. ¿Metafunción de raíz cuadrada?
- 3. raíz cuadrada de seguimiento del valor móvil
- 4. Raíz cuadrada para Bigint en F #
- 5. Take raíz cuadrada positiva en Mathematica
- 6. ¿Cómo se implementa la función de raíz cuadrada?
- 7. ¿Implementación de hardware de raíz cuadrada?
- 8. Raíz cuadrada inversa inusual de John Carmack (Quake III)
- 9. Aproximando la raíz cuadrada de la suma de dos cuadrados en un microcontrolador
- 10. ¿Cómo puedo mejorar este método de raíz cuadrada?
- 11. ¿Cómo calculo la raíz cuadrada de un número sin usar builtins?
- 12. HTML, CSS: barra superior a juego símbolo de raíz cuadrada
- 13. Encontrar la raíz cuadrada de un número dado usando operaciones bit a bit
- 14. Representación de flotador en C
- 15. Crear onda sinusoidal o cuadrada en C#
- 16. flotador: dejado en objetivo-c
- 17. Calcular enésima raíz con la aritmética de enteros
- 18. Calcular la mediana en C#
- 19. Definiciones de raíz cuadrada, seno, coseno, prisionero de guerra, etc., en cmath
- 20. ¿Dónde puedo encontrar el código fuente para la función de raíz cuadrada de Java?
- 21. C#: Cómo calcular la relación de aspecto
- 22. Cómo calcular fmod en C#?
- 23. C#: Convertir matriz de bytes en un flotador
- 24. C# flotador a la conversión decimal
- 25. Convertir flotador para std :: string en C++
- 26. Objective-C cómo imprimir el 0 para un flotador?
- 27. ¿Cómo obtener la enésima raíz de grandes números en C++?
- 28. Cómo obtener la representación binaria IEEE 754 de un flotador en C#
- 29. Al tomar la palabra de un flotador
- 30. C#: ¿Multiplicar decimal con flotador?
Uso poderosa magia - [0x5f3759df] (http://www.codemaestro.com/reviews/9) – jball
que la magia es el inverso de la raíz cuadrada. Pero existe una magia similar para sqrt. Y esto pierde precisión. – CodesInChaos
@CodeInChaos - la segunda muestra de código en el artículo tiene una implementación para sqrt: * "Tenga en cuenta que la única diferencia real es en el valor de retorno - en lugar de devolver y, devolver el número * y como la raíz cuadrada" * – jball