在 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 > b
但 a-b == 0
.
假设一个实现支持次正规化并且符合 C 标准,另一个问题是该标准允许实现在浮点表达式中使用额外的精度。如果您的 a
和 b
实际上是表达式而不是单个对象,则额外的精度可能会导致 a > b
为真,而a-b == 0
为假。实现可以随意使用或不使用这种额外的精度,因此 a > b
在某些评估中可能为真,而在其他评估中则不成立,对于 a-b == 0
也是如此。如果 a
和 b
是单个对象,则不会发生这种情况,因为标准要求实现“丢弃”分配和强制转换中的过度精度。
关于c++ - float : Is it true if a > b then a - b > 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64345197/