1

clang-tidy [bugprone-incorrect-roundings]检查的文档说:

数字 0.499999975(小于 0.5 的最小可表示浮点数)四舍五入为 1.0

据我所知,下面的最小浮点数0.50.4999999702,而不是0.499999975。但尽管如此,这两个数字都为我提供0了天真的四舍五入计算的值

#include <iostream>

int main() {

    const float v1 = 0.499999975;
    const float v2 = 0.4999999702;

    std::cout << (int)(v1+0.5) << "\n" 
              << (int)(v2+0.5) << "\n";
}

我错过了什么吗?

4

1 回答 1

3

关于标准中的算术转换:

6.3.1.8 常用算术转换

...

  • 否则,如果任一操作数的对应实数类型为双精度,则将另一个操作数转换为对应实数类型为双精度的类型,而不改变类型域。

  • 浮动操作数的值和浮动表达式的结果可以用比类型要求更高的精度和范围来表示;

所以在这一行:

(int)(v1+0.5) 

您的v1变量被提升为双精度浮点运算,这就是您得到零的原因。

这应该可以解决您的问题:

#include <iostream>

int main() {

    const float v1 = 0.499999975f;
    const float v2 = 0.4999999702f;

    std::cout << (int)(v1 + 0.5f) << "\n" 
              << (int)(v2 + 0.5f) << "\n";
}
于 2019-03-27T09:50:22.053 回答