叮叮当当不正确的四舍五入
Clang-tidy incorrect rounding
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";
}
相关文章:
- 使用2个键的cpp-stl::优先级队列排序不正确
- 正弦级数方程计算不正确
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 密码登录程序将永远循环并显示不正确的结果
- 在C++中返回不正确的楼层函数值
- 形状对象的旋转和缩放不正确C++
- C++ 读取文件读取文件不正确
- 关于类的 Python 文档 - 对C++的引用不正确
- 特征 LLT 模块给出不正确的结果?
- glibcxx STL 在实现 std::valarray::sum() 时是否不正确?
- 如果语句逻辑不正确
- 来自逆 vp 矩阵和相机位置的光线方向不正确
- 不正确的操作数类型 MSVC
- 数组填充了不正确的值
- 我是否不正确地集中了这些字符数组?
- 为什么除非我使用 cout,否则我的值不正确?
- 计算幂级数的数学结果不正确
- 为什么 sizeof 在 C++ 中给出不正确的字节数?
- 叮叮当当不正确的四舍五入
- 数学四舍五入不正确