2012-12-30 147 views
0

我應用以下方法將Double/Float形式轉換爲合理形式。Double/Float TO Rational(X/Y Form)

For Ex。

a=0.125 
Find t=1000 
Find k=GCD(t,a*t); 
Print (a*t/k) "/" t/k 

它給出0.125的正確o/p但不是0.12。 問題在於找到t。請幫我解決這個問題。 下面是代碼,

#include<iostream> 
#include<stdio.h> 
#include<stdlib.h> 
using namespace std; 
int gcd(int a,int b) 
{ 
    if(b==0) 
    return a; 
    else 
    return gcd(b,a%b); 
} 
void DoubleToRational(float a) 
{ 
    int t=1; 
    while((float)t*a!=(int)(t*a)) 
    { 
    //cout<<t*a<<" "<<(float)t*a<<" "<<(int)(t*a)<<endl; // For Checking 
    t=t*10; 
    } 
    int k=gcd(t*a,t); 
    cout<<(int)t*a/k<<"/"<<t/k; 
} 
int main() 
{ 
    DoubleToRational(0.125); //0.021 seconds Works Perfectly 
// DoubleToRational(0.12); //Didnt Work ???? 
    return 0; 
} 

此外,我不希望當精度爲大這種方法來提高工作效率。 請在這種情況下建議修改/其他方法。

回答

3

數字0.125可以完全用二進制浮點表示。但號碼0.12不能。因此,您正在找到最接近的可表示數的合理值。這絕對不是3/25。事實上,closest double precision value0.12是:

0.11999 99999 99999 99555 91079 01499 37383 83054 73327 63671 875 

爲了使任何合理的進展完成這個任務,你可能會需要帶小數點的數據類型,而不是二進制類型像double來代表你的價值觀。

如果上述內容對您沒有任何實際意義,那麼我建議您閱讀以下內容:What Every Computer Scientist Should Know About Floating-Point Arithmetic

+0

我該如何在代碼中將0.12表示爲6/50 – user1413523

+0

對於0.12而不是二進制使用十進制表示。停止使用'double'。 –

+0

但是,假設如果輸入是雙倍 ,如0.12,2.3456,1.76899922等,那麼我應該使用什麼方法使它成爲x/y形式...... – user1413523