我试图得到帐篷方程的固定点。在给定的初始条件下,解决方案必须为0.6。当我使用float for 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;
}
}
答案 0 :(得分:2)
使用0.5999994832150543633275674437754787504673004150390625
时,第55次迭代的实际值为double
,而0.60000002384185791015625
(在我的系统上)为float
。
两者之间的区别在于精确度这些数字是什么,而四舍五入是让你失望的原因。
顺便说一句,这两个值都不是绝对准确,它们只是足够近似而已。double
更“精确”。
<强>更新强>
经过几次反复评论后发现浮点运算不需要杜松子酒。整数(稍加修改)做得很好和不会引入任何舍入。