2016-02-12 82 views
1

我試圖尋找這個問題的答案,但無濟於事。 我想要做的是計算cos(x)在0和用戶提供的數字之間的弧度(0)。我是新來的C++,所以如果這是微不足道的,請溫和。爲什麼cos(M_PI_2)== float(0)評估爲false? C++

這是從我的代碼摘錄,(也注意到我並不完全確定#import#include之間的差異,但我離題了)。

#define _USE_MATH_DEFINES 
#import <iostream> 
#import <algorithm> 
#include <math.h> 
#include <stdio.h> 

int count = 0; 
if (r > 0) { 
    for (float i = 0; i < r; i += M_PI_2) { 
     printf("\n\n%s: %f: %f\n\n", cos(i) == -float(0) ? "true":"false", \ 
      cos(i), -float(0)); 
     if (cos(i) == float(0) || cos(i) == -0) { 
      count++; 
      printf("Count: %d", count); 
     } 
    } 

使用值2R作爲r,我應該讓計數增加一次,但if語句的計算結果爲false。我不確定我應該將浮點數轉換爲零,也不會檢查-0。無論如何,這是這段代碼中打印語句的輸出。

terminal snippet

它看起來像cos(M_PI_2)實際上等於-float(0)所以爲什麼不會cos(M_PI_2) == -float(0)評估爲false?再次,我剛剛開始接受C++的日子,所以如果這是微不足道的道歉。

+0

我認爲這是因爲四捨五入錯誤。嘗試'if(abs(cos(i))<0.00001)' – martijnn2008

+4

'#import'不是標準的C++。 –

+1

請參閱[浮點數學是否被破壞?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken) –

回答

5

這是一面浮點的雙刃劍。不要比較平等或不平等的浮點值。取而代之的是,將近似匹配值的範圍括起來:

abs(cos(i) - float(0)) <= 0.0001 ? "true":"false" 
+0

這工作,非常感謝!我會盡快接受答案允許。 – NotMe

+0

這適用蠻力來隱藏實際問題。正如哈羅德在他的回答中說,這兩個值不應該相等,所以平等測試正確地失敗。 –

4

它沒有被精確地打印出來,不足以顯示它不是零。

請注意,結果真的首先不應該是零,所以這不是問題所在。 pi/2顯然不是一個有理數,所以絕對不能表示爲一個浮點數(在的任何整數的基數,也包括二進制)。接近於pi/2的x的餘弦大致爲pi/2 - x,因此最接近於pi/2的浮點的餘弦的幅度大致爲該浮點與pi/2的實際值之差的大小。由於pi/2是一個相當大的數字(與所有小於它的浮點數相比),這種差異可以近似(它當然不是一個有理數),而不會將其清零。

+0

謝謝,我錯誤地使用了「pi/2」作爲浮點數。這意味着實際的問題。但實際上,如果我想通過'pi/2'增加一個數字,那麼這個數字的類型如果不是float,那麼應該是double呢? – NotMe

+1

@NotMe它不能用任何有限精度的數學來完成。然而,這並不需要計算零的數量(這可能在R中),你可以在沒有嘗試訪問它們的情況下找到它。 – harold

相關問題