我可以比较两个分数,如果两个分数都具有2的幂

时间:2011-06-05 21:50:11

标签: c++ floating-point

我知道比较两个真实并不是“可能”,但对于具有2的分母能力的真实来说是真的吗

这位国王的平等总是回归真实

if( 3/4. == 6/8. ) {}

4 个答案:

答案 0 :(得分:4)

这种表达式应始终评估为true,但需要注意几点:

  • 分子不超过2 ^ 52;否则他们会失去精确度。
  • 分母不超过双精度提供的范围。
  • 你必须在使用radix-2浮点的平台上工作(基本上都是现代机器)。

答案 1 :(得分:3)

我无法引用任何说明保证的内容,但从逻辑上讲它应该可以工作,因为所有IEE754浮点数都表示为M * 2 ^ E,其中M和E都是整数(和可能是否定的。)

因此3 / 4.06 / 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的幂。