gpt4 book ai didi

c++ - Double/Float TO Rational (X/Y 形式)

转载 作者:搜寻专家 更新时间:2023-10-31 01:12:04 26 4
gpt4 key购买 nike

我应用了以下方法将 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.Please 帮我解决这个问题。这是代码,

#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;
}

另外,当精度很高时,我不希望这种方法有效地工作。请在这种情况下建议修改/其他方法。

最佳答案

数字0.125 可以用二进制 float 精确表示。但是数字 0.12 不能。因此,您正在寻找最接近 0.12 的可表示数字的有理值。这绝对不是 3/25。事实上 closest double precision value 0.12 是:

0.11999 99999 99999 99555 91079 01499 37383 83054 73327 63671 875

为了在这个任务上取得任何合理的进展,您可能需要用十进制数据类型而不是像 double 这样的二进制类型来表示您的值。

如果以上内容对您没有任何实际意义,那么我建议您好好阅读一下:What Every Computer Scientist Should Know About Floating-Point Arithmetic .

关于c++ - Double/Float TO Rational (X/Y 形式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14094177/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com