次の方法を適用して、Double/Float形式を有理形式に変換しました。
例の場合
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;
}
また、精度が高い場合、この方法が効率的に機能することは期待できません。その場合の修正/その他の方法を提案してください。