我知道比较两个真实并不是“可能”,但对于具有2的分母能力的真实来说是真的吗
这位国王的平等总是回归真实
if( 3/4. == 6/8. ) {}
答案 0 :(得分:4)
这种表达式应始终评估为true
,但需要注意几点:
答案 1 :(得分:3)
我无法引用任何说明保证的内容,但从逻辑上讲它应该可以工作,因为所有IEE754浮点数都表示为M * 2 ^ E,其中M和E都是整数(和可能是否定的。)
因此3 / 4.0
和6 / 8.0
完全等于3 * 2 ^ -2,并且在IEE754格式中完全可以表示。
此外,鉴于:
% cat test.cc
double three_quarters = 3 / 4.0;
double six_eighths = 6 / 8.0;
我们得到:
% c++ -S test.cc
% cat test.s
.globl _three_quarters
.data
.align 3
_three_quarters:
.long 0
.long 1072168960
.globl _six_eighths
.align 3
_six_eighths:
.long 0
.long 1072168960
这表明两个表达式已经(由编译器)减少到相同的常量值。
答案 2 :(得分:1)
不要求C ++实现使用IEEE 754浮点(或类似)。但如果你的确如此,这应该可以正常工作。
答案 3 :(得分:0)
一般来说,浮点相等比较是否有效取决于值,而不取决于它们是如何获得的。
e.g。
double v = 4/3.0; // inexact
double old_v = v;
some_func_that_might_change_its_argument(&v);
if (v == old_v) { ... }
尽管价值不准确,可能会运作良好,但是:
double v = 0;
for( int i = 0; i < 5; ++i ) v += 0.1;
if (v == 0.5) { ... }
可能会失败,即使不等式的两边都可以表示为一个简单的有理数,其中分母是2的幂。