#include <iostream>
#include <math.h>
int main()
{
double result = sqrt(4732);
int intResult = (int)result;
result = result - (double)intResult;
double first = result;
while(1)
{
result = 1/result;
intResult = (int)result;
result = result - intResult;
std::cout<<intResult<<std::endl;
double absDiff = result > first ? (result-first):(first-result);
if(absDiff < 0.000001)
break;
}
return 0;
}
我正在尝试计算4732的平方根的连续分数。这是连续分数的维基描述。 https://en.wikipedia.org/wiki/Continued_fraction
正确的答案是[68; 1,3,1,3,45,1,1,2,11,15,5, 34 ,5,15,11,2,1 ,1,45,3,1,3,1,136]。 我的代码进入无限循环。这是前几次迭代的输出。 [68; 1,3,1,3,45,1,1,2,11,15,5,的 126 下,.. 请注意,输出开始偏离此处。
我已经检查过此代码中的其他数字,如9999,13,12等,它给出了正确的答案。 任何人都可以指出代码中的问题吗? 提前谢谢。
更新:我也使用了float128。但它并没有解决问题。看起来我可能不得不使用另一种算法来避免精度下降。
答案 0 :(得分:1)
感谢interjay指导我如何解决问题。这是为我提供正确结果的代码。这里的关键是不使用浮点运算,因为即使使用128位精度,它也会传播错误。
#include <iostream>
#include <math.h>
int main()
{
int num = 4732;
double result = sqrt(num);
int intResult = (int)result;
int a = intResult;
int b = 1;
int first_a = a;
int first_b = b;
do
{
double temp = (double)b/ (result - (double)a);
int I = (int)temp;
int new_a = (I*((num - (a*a))/b)) - a;
int new_b = (num - (a*a))/b;
a = new_a;
b = new_b;
std::cout<<I<<std::endl;
}
while((first_a != a) || (first_b != b));
return 0;
}