【发布时间】:2008-11-06 14:25:12
【问题描述】:
这只是为了满足我自己的好奇心。
有没有这样的实现:
float InvSqrt (float x)
{
float xhalf = 0.5f*x;
int i = *(int*)&x;
i = 0x5f3759df - (i>>1);
x = *(float*)&i;
x = x*(1.5f - xhalf*x*x);
return x;
}
在 C# 中?如果存在,请发布代码。
我想我应该提到我正在寻找一个“安全”的实现......无论哪种方式,BitConverter 代码都可以解决问题。联合的想法很有趣。我会测试它并发布我的结果。
编辑: 正如预期的那样,不安全的方法是最快的,其次是使用联合(在函数内部),然后是 BitConverter。这些函数执行了 10000000 次,我使用 System.Diagnostics.Stopwatch 类进行计时。计算结果显示在括号中。
Input: 79.67
BitConverter Method: 00:00:01.2809018 (0.1120187)
Union Method: 00:00:00.6838758 (0.1120187)
Unsafe Method: 00:00:00.3376401 (0.1120187)
为了完整起见,我测试了内置的 Math.Pow 方法和“naive”方法 (1/Sqrt(x))。
Math.Pow(x, -0.5): 00:00:01.7133228 (0.112034710535584)
1 / Math.Sqrt(x): 00:00:00.3757084 (0.1120347)
1 / Math.Sqrt() 之间的差异是如此之小,以至于我认为不需要求助于 C# 中的 Unsafe Fast InvSqrt() 方法(或任何其他不安全的方法)。除非一个真的需要从 CPU 中榨出最后一点汁液...... 1/Math.Sqrt() 也更准确。
【问题讨论】:
-
为了完整起见,您还应该使用“1/math.Sqrt()”运行测试。
-
我做到了,还有另一种情况。我会在验证结果后立即更新基准。
-
我认为您应该使用更大的集合运行测试,这样它们将需要几秒钟才能完成。
标签: c#