c++ - Clang-tidy 不正确的舍入
问题描述
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";
}
推荐阅读
- reactjs - 谷歌地图 API 接收到的反应组件更新数据中的 setState 问题
- wordpress - 如何在 wordpress 中使用 tax_query 显示自定义循环中使用的术语名称
- python - 在 keras 模型中输入时,我的输入 np 数组变成不同的形状
- microsoft-edge - 使用 launchWebAuthFlow api 发布扩展
- android - 从 google play 控制台派生的 apk 无法正常工作,但原始 apk 工作正常
- google-apps-script - Google App Script如何将公式设置为Google表格单元格
- php - 删除文本并仅返回 PHP 中的第一个链接
- python - 使用 selenium 选择具有重复类名的元素
- python - 新面板中的 Boxsizers
- wordpress - 插件中的 add_shortcode