双/浮点到有理数(X/Y形式)

Double/Float TO Rational (X/Y Form)

本文关键字:形式 有理数      更新时间:2023-10-16

我使用了以下方法将Double/Float格式转换为有理格式。

For example

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

它给出了正确的0/p为0.125,而不是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;
}

我也不希望这种方法在精度很大的时候有效地工作。请建议修改/其他方法

数字0.125可以精确地表示为二进制浮点数。但是数字0.12不能。所以你在寻找最接近0.12的可表示数的有理数。这绝对不是3/25。事实上,最接近0.12的双精度值是:

0.11999 99999 99999 99555 91079 01499 37383 83054 73327 63671 875

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

如果上面的内容对你来说没有任何真正的意义,那么我建议你好好阅读一下:每个计算机科学家都应该知道的浮点算术