Dai*_*Dai 23 c# double epsilon ieee-754 floating-point-precision
作为单元测试的一部分,我需要测试一些边界条件.一种方法接受一个System.Double参数.
有没有办法获得下一个最小的双值?(即将尾数减1个单位值)?
我考虑使用,Double.Epsilon但这是不可靠的,因为它只是从零开始的最小增量,因此不适用于较大的值(即9999999999 - Double.Epsilon == 9999999999).
那么所需的算法或代码是什么:
NextSmallest(Double d) < d
Run Code Online (Sandbox Code Playgroud)
......总是如此.
Jef*_*Sax 17
如果您的数字是有限的,您可以在BitConverter课堂上使用几种方便的方法:
long bits = BitConverter.DoubleToInt64Bits(value);
if (value > 0)
return BitConverter.Int64BitsToDouble(bits - 1);
else if (value < 0)
return BitConverter.Int64BitsToDouble(bits + 1);
else
return -double.Epsilon;
Run Code Online (Sandbox Code Playgroud)
设计IEEE-754格式,使得构成指数和尾数的位一起形成一个与浮点数具有相同排序的整数.因此,要获得最大的较小数字,如果值为正数,则可以从此数字中减去1,如果值为负,则可以添加1.
这有效的关键原因是没有存储尾数的前导位.如果你的尾数都是零,那么你的数字是2的幂.如果从指数/尾数组合中减去1,则得到所有1,您将不得不从指数位借用.换句话说:你必须减少指数,这正是我们想要的.
| 归档时间: |
|
| 查看次数: |
2512 次 |
| 最近记录: |