整齐的错误舍入

αλε*_*λυτ 3 c++ rounding clang-tidy

clang-tidy [bugprone-in Correct-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";
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

moh*_*uje 5

关于标准中的算术转换:

6.3.1.8 常用算术转换

...

  • 否则,如果任一操作数对应的实数类型为 double,则另一个操作数将在不更改类型域的情况下转换为对应实数类型为 double 的类型。

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

所以在这一行中:

(int)(v1+0.5) 
Run Code Online (Sandbox Code Playgroud)

您的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";
}
Run Code Online (Sandbox Code Playgroud)