2015-02-23 90 views
0

在使用浮點數時使用運算符有什麼問題。我們不能使用'==''< ='等運算符與浮點數嗎?爲什麼我們不能使用帶有浮點數的運算符?

這裏是代碼。

# include <iostream> 

using namespace std; 

main(){ 
float x, y, z; 
cout<<"1st integer: "; 
cin>>x; 

do { 
    cout<<"2nd integer: "; 
    cin>>y; 
    if(y<=0){ 
      cout<<"You can't divide by zero"<<endl; 
      continue; 
     } else { 
       break; 
       } 
     } while (1); 

z = x/y; 
cout<<"Result: "<<z; 


} 

它生成正確的結果,因爲我想得到。但是從我聽到的一些地方來看,使用浮點數的運算符並不是一個好邏輯。爲什麼?

+0

相關閱讀:http://stackoverflow.com/questions/21895756/why-are-floating-point-numbers-inaccurate'0.1 + 0.2 == 0.3000 ... 4'並且是'> 0.3'(不是' == 0.3')。 – Caramiriel 2015-02-23 06:57:09

+0

@Galic,實際上兩個浮點數#是完全相等的。事實上,它們可能更有可能是平等的,如果你有無限的精度。例如:float a = 1.0f,b = 1.0f;肯定會做一個== b。此外,如果delta低於float的精度,那麼==(b + delta)也是正確的。有什麼問題是,有時他們是不相等的,當你期望他們... – thang 2015-02-23 07:03:52

+0

@TonyD但是當我在整數變量而不是浮點使用這個程序會發生什麼?我的意思是如果我輸入0.50的分子值,循環不會中斷,它會連續運行並顯示結果,爲什麼?整數會丟棄小數,所以爲什麼它不在這裏實現? – 2015-02-23 07:38:07

回答

-1

你在做什麼很好。你需要注意的是使用具有浮點的相等運算符==,因爲結果可能會讓你感到驚訝(例如0.1 + 0.2 != 0.3)。

但是使用>,>=,<=,<沒有問題。

+2

*「但是使用>,> =,<=,<。」*沒有問題 - 例如,在[ideone.com這裏](https://ideone.com/rgZM4j)'.1 + .2> .3'而'.3 * .3 <.9'。 – 2015-02-23 07:26:45

+1

@TonyD第一個例子是一個正確的例子,但'.3 * .3' * *小於'.9',這裏'.3 * .3 ==。09'正確地評估爲true。一個更好的例子可能是'.2 * .2> .04' – KillianDS 2015-02-23 08:39:44

+0

@KillianDS:哦,是的 - 是的 - 急於演示你已經知道的東西,很容易被粗心的......謝謝。 – 2015-02-23 10:06:24

-1

您可以將浮點數安全地與精確爲零進行比較。這將防止零除。

你不能做的是檢查x==0.1,然後除以x-0.1。由於0.1不完全可以表示,因此您將以通常未知的方向四捨五入。

+0

這是一個不好的例子。如果'x'不等於'0.1',那麼'x-0.1'不會等於'0.0',並且可以安全地除以。 – TonyK 2015-02-23 08:44:26

+0

@TonyK:你的陳述對於IEEE754來說是正確的,對於4種基本的算術運算,IEEE754具有比特完美的四捨五入,但C++沒有要求IEEE754。 – MSalters 2015-02-23 08:46:46

+0

'x-0.1'將會非常非零 - 在最壞的情況下,絕對值大約爲'0.05 * epsilon'。這是IEEE 32位格式的「0.1 * 2^-24」;對於這種格式,即使沒有使用非規格化數字,最小的可表示正數爲'2^-126'。對於任何實際的浮點表示,這種巨大的差異不會消失。 – TonyK 2015-02-23 08:59:47

相關問題