2017-02-15 75 views
0

我正在尝试获取帐篷方程的固定点。在给定的初始条件下,解决方案必须为0.6。当我将float用于x0时,一切正常,但是当我将x0定义为double时,解决方案在第55次迭代中变为0.59999,这会在下一次迭代中导致进一步的变化,等等。为什么选择数据类型时有这样的差异?导致错误的双数据类型

using namespace std; 
#include <iostream> 
main() 

{ 
    double x0=.6; 
    for (int i=0;i<100;i++) 
    { 
     if(x0<.5) 
      x0=1.5*x0; 
     else 
      x0=1.5*(1-x0); 

     cout << i << "\t" << x0 << endl; 

    } 

} 

我已经发布了结果图片。 Comparison of solutions - Float and Double

+1

你被四舍五入的欺骗。添加'cout << setprecision(100)'将打印所有的数字。并访问该问题[浮点数学是否被破坏?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken)。 – molbdnilo

+1

如果可能,最好将文本结果添加为文本。您附加的图像可以用您问题中的代码块文字编写。 –

回答

2

55次迭代的真正价值是0.5999994832150543633275674437754787504673004150390625当使用double0.60000002384185791015625用于float(我的系统上)。

两者之间的差异在于数字有多精确并且舍入是什么使您抛弃。

顺便说一句,无论是两个值是绝对准确,他们只是足够接近近似,仅此而已。 double“更精确”。


UPDATE

几点意见来回后,事实证明,没有必要进行浮点运算是杜松子酒。整数(稍微修改)做得很好不会引入任何舍入。

+0

谢谢。我正试图模拟动荡的系统,在这个系统中发生混乱。方程对初始条件非常敏感。轻微的变化会导致未来迭代的巨大变化。有没有解决这个问题的方法? – Arjun

+0

你的问题真的取决于“这个问题”的**精确**定义。 “float”与“double”有什么不同?还是说“double”的精确度不足以满足您的需求?或者说,二进制数不是表示小数部分的好选择的问题? – YePhIcK

+0

我担心的是解决方案在某个迭代中偏离了它的确切值(在这种情况下为0.6),导致下一次迭代返回错误的解决方案。有没有办法在所有迭代中获得精确值(0.6)? – Arjun

相关问题