我正在进行高精度的科学计算.在寻找各种效果的最佳表示时,我不断提出想要获得下一个更高(或更低)双精度数的理由.基本上,我想要做的是在double的内部表示中添加一个最低有效位.
难点在于IEEE格式不完全一致.如果要使用低级代码并实际将一个代码添加到最低有效位,则生成的格式可能不是下一个可用的双精度型.例如,它可能是一个特殊的案例编号,例如PositiveInfinity或NaN.还有一些次正常值,我不认为这些值,但它们似乎具有与"正常"模式不同的特定位模式.
可以使用"epsilon"值,但我从未理解其定义.由于double值不是均匀间隔,因此不能将单个值添加到double以产生下一个更高的值.
我真的不明白为什么IEEE没有指定一个函数来获得下一个更高或更低的值.我不可能是唯一需要它的人.
有没有办法获得下一个值(没有某种类型的循环尝试添加更小和更小的值).
当比较不同的大双打时,会发生以下测试失败:
[Test]
public void DoubleMaxValueTest()
{
double val = Double.MaxValue;
double epsilon = 10000.0;
Assert.IsTrue(val > (Double.MaxValue - epsilon));
}
Run Code Online (Sandbox Code Playgroud)
意识到双精度表示为尾数,指数和符号位,这是因为值Double.MaxValue - 10000实际上与Double.MaxValue(这些值相等)的表示方式相同.
问题是:如何获得此测试返回的最小epsilon?