2016-11-23 63 views
1
#include<iostream> 
#include<string> 
#include<cstdlib> 
using namespace std; 

int main() 
{ 
double a,b,res; 

while(cin>>a>>b) 
{ 
    res = a/b; 

    if((res*b) == a) 
     cout<<"Terminates"<<endl; 
    else 
     cout<<"Does not terminate"<<endl; 
} 

return 0; 
} 

所以,這裏是我的代碼,看看如果a/b導致終止小數或不。一些輸入產生正確的輸出,如:終止十進制

1/3:不終止,

1/9:不終止,

1/7:不終止,

22/7:不終止,

1/2:終止。

除1/5應顯示:1/5 : Terminates,但輸出爲:Does not terminates

我知道C++浮點存在很多問題,試圖谷歌,但它就像一個謎題。

+2

在二進制算術中,1/5是非終止分數。 –

+0

你能解釋更多請@PatriciaShanahan – inhaler

+0

好的,我有種得到它@PatriciaShanahan – inhaler

回答

5

有一個簡單的方法來詢問的比率是否具有在給定的基數中的一個精確的,終止的表示,你的情況10.

步驟1是將其降低到它的最低條件。按照最高的公因數劃分頂部和底部。

現在只有分母很重要。如果它的每個主要因素都是基數的主要因素,則分數將以該基數結束。 5是10的主要因子,因此1/5以十進制結束。 5不是2的主要因素,所以1/5不以二進制結尾。

3

只有1/2,1/4,1/8等分數(或總和)在double中精確表示。所有其他人都是近似值。因此,結果1/5 * 5可能等於0.9999999999

這就是爲什麼一個人永遠不應該比較浮點數的平等(至少不是沒有要求的精度,如testedValue - num < precision)。

+0

我能在這裏做什麼呢? @Hcorg – inhaler

+0

或者選擇精度進行比較,或者使用某些庫來處理分數。定點算術可以幫助(例如Boost Multiprecission) – Hcorg

+0

我正在解決的問題是:取2個整數a和b輸入並檢查a/b結果終止小數。我把輸入作爲雙重原因int/int除法將導致整數&upcasting將導致相同的@Hcorg – inhaler