2011-06-05 49 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浮點(或類似)。但如果你的確如此,這應該可以正常工作。

相關問題