提问人:David Vonka 提问时间:9/25/2023 最后编辑:David Vonka 更新时间:9/26/2023 访问量:49
Round 函数保证生成最佳浮点近似?
Round function guaranteed to generate the best floating point approximation?
问:
当我运行时,我是否保证得到相同的浮点近似值(3.1200000000000000010658141036401502788066864013671875
) 当我使用文字时我得到的?round(3.12143345454353,2)
3.12
换句话说,round(3.12143345454353,2)===3.12 会是真的吗?一般来说是这样吗,所以如果 x 舍入到 y,浮点算术是否保证 round(x,k)===y?
答:
是的,也不是。
这取决于舍入模式和实施质量。round()
代码到值的编译时转换取决于舍入的语言和编译器选项。转换为最接近的 binary64 值(如 (13))非常常见。3.12
3.120000000000000106...
0
根据上下文和语言,源代码 like 甚至可以转换为更高精度的数学,因此具有类似于 3.11999999999999999999959 的值......(16 ),3.12
9
如果假定的函数(四舍五入到最接近的 10-d)存在,则即使调用 .David_Vonka_round(x, d)
David_Vonka_round([digits].[digit][digit]0, 2)
在 C 中考虑以下几点
// Weak rounding code
double David_Vonka_round(double x, int d) {
pow10 = pow(10, d);
// Note that `x * pow10` incurs a rounded product.
// Note that `product + 0.5` incurs a rounded sum.
long long y = (long long) (x * pow10 + 0.5);
// A 3rd operation
return y/pow10;
}
前 2 个数学运算,除非以更高的精度完成,否则会产生可能与预期数学运算不同的结果。这与 几乎没有区别。(它与以下值有重要区别y
David_Vonka_round([digits].[digit][digit]0, 2)
David_Vonka_round([digits].[digit][digit]5, 2)
)
这 3 个数学运算也受当前舍入模式(最接近、向上、向下、趋近于零等)的约束,该模式可能与编译期间使用的舍入模式不同。然后,第三个运算符可以在运行时形成与编译代码不同的值。/
一般来说,OP 可以预期相同,但边缘情况、变体舍入模式和弱代码都会导致差异。
评论
d
评论
==
1.23
1.230
1.23
1.230
123e-2
123e-02
1.23L
123456789…123456789e-100
1.23456789…123456789
round(x,i)