C++ 双精度/浮点数到有理数(X/Y形式)
我应用以下方法将双精度/浮点形式转换为有理形式 例如C++ 双精度/浮点数到有理数(X/Y形式),c++,C++,我应用以下方法将双精度/浮点形式转换为有理形式 例如 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,in
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;
}
#包括
#包括
#包括
使用名称空间std;
内部gcd(内部a、内部b)
{
如果(b==0)
返回a;
其他的
返回gcd(b,a%b);
}
无效双托(浮动a)
{
int t=1;
而((浮点)t*a!=(int)(t*a))
{
//cout数字0.125
可以用二进制浮点精确表示。但是数字0.12
不能。因此,您正在寻找距离0.12
最近的可表示数字的有理值。这绝对不是3/25
。事实上,to0.12
是:
0.11999 99999 99999 99555 91079 01499 37383 83054 73327 63671 875
为了在这项任务中取得合理的进展,您可能需要使用十进制数据类型而不是像double
这样的二进制类型来表示您的值
如果上述内容对您来说没有任何实际意义,那么我建议您仔细阅读:。使用十进制表示法表示0.12而不是二进制。停止使用double
。但是假设输入是双精度的,如0.12、2.3456、1.76899922等,那么我应该应用什么方法将其转换为x/y形式……您不能表示0.12
在一个双精度
,就像我说的。你能得到的最接近的是0.11999 99999999555 91079 01499 37383 83054 73327 63671 875
。所以如果你从双精度
开始,那就太晚了。你丢失了重要信息。你需要使用十进制表示法。阅读我链接的论文。好的,谢谢你帮我清理了ubts…我还想知道另一种方法,当prcecision是高。。。。。