【发布时间】:2019-07-30 03:56:23
【问题描述】:
我之前发布了一个关于 C++ 函数ceil()、floor() 和round() 的精度损失问题的问题。问题的链接如下。
Will ceil(), floor() and round() meet loss-of-precision problems when converted to integers?
从我收到的两个答案中,我了解到这些函数本身是精确的,但它们会放大现有的精度损失问题。
我想知道这些问题会被放大到多大程度。具体来说,请考虑以下几点。
a = fun(b);
这里,a 是整数类型值(int、long、long long 等),b 是浮点类型值(float、double 等),并且fun() 是 ceil()、floor() 和 round() 之一。请注意,在以下所有讨论中,我假设不存在上溢或下溢问题。
请注意,在这里,我假设 b 是通过其他可能导致精度损失的操作获得的。例如,假设我希望 b 等于 1.1 + 3.9 = 5,但是由于无法表示 1.1 和 3.9,所以 b 不会以 5 结尾。
我想知道这些问题会在多大程度上影响 a 的价值。具体来说,a 的正确值(即,如果 b 没有精度损失)与实际获得的值(即,如果存在潜在的精度损失)相差多少。假设我们将正确的值表示为 a1,将实际值表示为 a2。在我看来,在任何情况下,以下结论都必须成立。
- 如果
fun()是ceil(),则a2 等于a1 或a1 + 1。 - 如果
fun()是floor(),则 a2 等于 a1 或 a1 - 1。 - 如果
fun()是round(),则a2 等于a1。
我的问题是,如果我们忽略溢出和下溢
- 上述结论总是成立吗?
- 如果无法修复 b 的精度损失,如何修改代码以确保 a2 始终等于 a1?
【问题讨论】:
-
如果您询问的是 C++,请不要包含 C 标签,反之亦然。
标签: c++