持续的分数代码错误

时间:2016-08-27 22:12:56

标签: c++

 #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。但它并没有解决问题。看起来我可能不得不使用另一种算法来避免精度下降。

1 个答案:

答案 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;
}