c++ - float : Is it true if a > b then a - b > 0?

标签 c++ floating-point precision

在 c++ 中对于两个 double a 和 b,如果 a > b,那么 a - b > 0 是真的吗?假设a、b不是Nan,只是普通数

最佳答案

不,不仅仅是 C++ 标准的要求。 C++ 允许实现使用浮点类型而不支持次正规数。在这种类型中,您可以让 a 等于 1.00012•2m,其中 m 是最小正态指数,b 等于 1.00002•2m。那么 a > b 但是 a-b 的确切值是不可表示的(它会是次正规的),所以计算结果是零。

支持次正规的 IEEE-754 算法不会发生这种情况。但是,一些可能不符合 C++ 标准的 C++ 实现使用 IEEE-754 格式,但将次规范结果刷新为零。所以这也会产生 a > ba-b == 0.

假设一个实现支持次正规化并且符合 C 标准,另一个问题是该标准允许实现在浮点表达式中使用额外的精度。如果您的 ab 实际上是表达式而不是单个对象,则额外的精度可能会导致 a > b 为真,而a-b == 0 为假。实现可以随意使用或不使用这种额外的精度,因此 a > b 在某些评估中可能为真,而在其他评估中则不成立,对于 a-b == 0 也是如此。如果 ab 是单个对象,则不会发生这种情况,因为标准要求实现“丢弃”分配和强制转换中的过度精度。

关于c++ - float : Is it true if a > b then a - b > 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64345197/

相关文章:

c++ - IEEE 754 浮点除法的可逆性

precision - Ada 定点类型的限制

c++ - 模板类中常规类中的模板成员函数不能用 GCC 编译,但可以用 VC++

json - 如何将字符串解析为 float ?

javascript - 将 float 缩放 10 总是精确的

python - 如何在 Python 中精确打印 double?

c++ - SQLite3 多进程性能测试

c++ - OpenCL:减少示例,并保留内存对象/将 cuda 代码转换为 openCL

c++ - Visual Studio 2008 发布版本不修饰 DLL 导出

python - 在字典中对小数进行排序