双/浮点到有理数(X/Y形式)
Double/Float TO Rational (X/Y Form)
我使用了以下方法将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
这样的二进制类型。
如果上面的内容对你来说没有任何真正的意义,那么我建议你好好阅读一下:每个计算机科学家都应该知道的浮点算术
相关文章:
- 不带大括号的枚举形式
- 在Windows中以.exe的形式运行c++
- TSP递归解的迭代形式
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 具有引用成员的结构是否具有唯一的对象表示形式
- 如何使用字符串find_first_of缓冲区形式(size_t n 参数)
- #if 如何工作?我误解了 #if~#endif 的形式吗?
- 向量是否存在行主要形式?
- 是否可以保证按字节的零 int 是零的表示形式?
- 在 C++ 中将整数数组转换为位集表示形式的最佳方法?
- 浮点数为 32 位和 64 位二进制表示形式
- 将自定义 QMap 模板实例化以人类可读的形式保存在 QSettings 中
- 如何获取 BITMAPFILEHEADER 和 BITMAPINFOHEADER 的字节表示形式?
- 使用 int 指针的浮点数的位表示形式
- 基于类型作为参数的字符串表示形式具有不同返回类型的函数
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- 内存中的长长类型表示形式
- 如何将uint8_t的二进制表示形式读取为数字
- 我应该以字符形式存储数字以节省内存吗?
- 双/浮点到有理数(X/Y形式)