2011-06-05 51 views
4

功率我知道这不是“可能”来比较两个真实的,但它是真正的真实其中有2我可以比较两个分数如果两者都具有分母的2

分母功率

这是王平等始终返回true

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

你为什么不试试自己? – Saphrosit 2011-06-05 21:53:29

+0

@Saphrosit:因为我想确认和建议/评论 – Guillaume07 2011-06-05 21:55:07

+9

@Saphrosit:浮点错误非常复杂,依赖测试随机值是一个很好的方法来得出错误的结论。 – 2011-06-05 21:57:19

回答

4

这种表达应该始终评估为true,有几个注意事项:

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

为什么分母不能太大,你能完成请 – Guillaume07 2011-06-05 21:56:23

+0

我已编辑。 – Guillaume07 2011-06-05 21:59:07

+0

@ Guillaume07:在这种情况下,它非常大(或者实际上非常小),它们超出了双精度范围。可能不会成为你的关心!另一个要考虑的是分子是否会超过2^52(否则他们会失去精度)。 – 2011-06-05 22:02:58

0

通常,浮点相等比较的工作原理不取决于值,而是取决于数值。

例如

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.

+0

恰好如此,第二个例子确实导致了平等。 – 2011-06-05 22:08:26

+0

@Oli:在哪个系统上?该标准不允许。并且,例如,[这个微小的变化](http://ideone.com/ZbHhf)不会。 – 2011-06-05 22:40:17

+0

我同意不能保证他们是平等的。但在IEEE-754(双倍或单一)中,总和确实为0.5。 – 2011-06-05 22:49:05

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 

这都说明两个表达式已经减少(由编译器),以相同的恒定值。

+1

尽管C++并没有强制要求IEEE754进行浮动和双精度处理;) – fredoverflow 2011-06-06 08:56:13

1

没有要求C++实现使用IEEE 754浮点(或类似)。但如果你的确如此,这应该可以正常工作。

相关问题