Float
の平方根をC#
に、XNAでCore.Sqrt
に似たものを計算するにはどうすればよいですか?Cで浮動小数点の平方根を計算する方法
答えて
はこれを言うために嫌い、しかし限りMath.Sqrtとして3倍取る0x5f3759dfようです。私はちょうどタイマーでいくつかのテストをしました。 for-loopで事前計算された配列にアクセスするMath.Sqrtは約80msでした。 同じ状況下で0x5f3759dfが得られました。180 + ms
リリースモードの最適化を使用してテストを数回行いました。以下
出典:
/*
================
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();
}
}
正直言って、これはかなりオフトピックですが、とにかく面白いです! – 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();
}
スタックオーバーフローへようこそ!この回答はおそらく正確で有用なものですが、問題の解決に役立つ方法を説明するためには、[それにいくつかの説明を含めてください](http://meta.stackexchange.com/q/114762/159034)をお勧めします。これは、将来的には、作業が停止する原因となる変更(無関係かもしれない)があり、ユーザーは以前の作業の仕組みを理解する必要がある場合に、特に便利になります。 –
- 1. 浮動小数点計算
- 2. ULP計算浮動小数点
- 3. 浮動小数点演算
- 4. 小数点浮動小数点(C++)
使用強力な魔法 - [0x5f3759df](http://www.codemaestro.com/reviews/9) – jball
魔法は逆平方根であること。しかし、sqrtにも同様の魔法が存在します。そして、これは精度を失う。 – CodesInChaos
@CodeInChaos - 記事の2番目のコードサンプルにはsqrtの実装があります:* "実際の違いは戻り値にあります - yを返す代わりに、数値* yを平方根として返します" * – jball