叮叮当当不正确的四舍五入

Clang-tidy incorrect rounding

本文关键字:四舍五入 不正确 叮叮当当      更新时间:2023-10-16

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

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

据我所知,0.5以下最小的浮点数是0.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";
}

我错过了什么吗?

关于标准中的算术转换:

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";
}