c++ - 我可以信任代表整数的 float 或 double 来保持精度吗?

标签 c++ floating-point precision

<分区>

如果我有两个代表精确整数(在 32 位整数范围内)的随机 float 或 double ,我能否期望它们之间的任何和所有加法、减法和乘法产生一个没有小数的整数 float / double 部分?

float x = randInt();
float y = randInt();
float resultAdd = x + y;
float resultSub = x - y;
float resultMul = x * y;
if(fract(resultAdd) == 0.f && fract(resultSub) == 0.f && fract(resultMul) == 0.f){
    // will this section always execute, assuming no overflow occurred?
}

每个人都明白永远不要相信浮点精度,但我想在适当的时候重建信任。鉴于某些解释性语言(不明智地)使用 float / double 作为通用“数字”类型的基础,了解哪些操作可以将 float 的状态保留为整数很重要。

最佳答案

IEEE-754单精度float尾数只有24位,显然不能准确表示32位范围内的所有整数

例如,如果 x = 16777216.0f,y = 1.0f,则 x + y 不等于 16777217

OTOH IEEE-754 double 有 53 位尾数,因此它可以准确表示每个 32 位整数。这就是为什么某些语言(如 Javascript 或 Lua)的所有数值只有双倍

参见 Are all integer values perfectly represented as doubles?

关于c++ - 我可以信任代表整数的 float 或 double 来保持精度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53111758/

相关文章:

c++ - 如何使用 C++ 在启动时打开一个新窗口?

javascript - 确定一个 float 是否是另一个 float 的倍数?

c - C中的scanf(用于扫描 float )和精度问题

函数精确度和召回率

java - 仅使用整数的乘法和除法时是否可能会失去精度?使用 double 怎么样?

mysql - 将日期时间转换为十进制以在 MySQL 中保留毫秒

c++ - QT ReplaceChild 方法

c++ - 如何在 borland c++ 5.02 中使用 ROM BIOS 中断?

c++ - C++ 如何解释一个包含 '+' 的 cout?

python - float 到整数的转换在 Python 中表现得非常奇怪