C++ 导致错误的双数据类型
我试图得到帐篷方程的不动点。在给定的初始条件下,解必须为0.6。当我对x0使用float时,一切都很好,但是当我将x0定义为double时,在第55次迭代中,解决方案将更改为0.59999,这将导致在下一次迭代中进一步更改,以此类推。为什么在选择数据类型时会有这样的差异C++ 导致错误的双数据类型,c++,double,C++,Double,我试图得到帐篷方程的不动点。在给定的初始条件下,解必须为0.6。当我对x0使用float时,一切都很好,但是当我将x0定义为double时,在第55次迭代中,解决方案将更改为0.59999,这将导致在下一次迭代中进一步更改,以此类推。为什么在选择数据类型时会有这样的差异 using namespace std; #include <iostream> main() { double x0=.6; for (int i=0;i<100;i++) {
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;
}
}
使用名称空间std;
#包括
main()
{
双x0=.6;
对于(int i=0;i当使用double
时,第55次迭代的实际值为0.5999483215054363375674437754787504673040390625
,对于float
(在我的系统上)则为0.60000002384185791015625
两者之间的区别在于数字的精确程度,而舍入是让你感到不舒服的地方
顺便说一句,这两个值都不是绝对精确的,它们只是非常接近的近似值,仅此而已。double
更精确
更新
经过几番反复的评论,结果证明浮点运算不需要与.integer(稍加修改)结合使用做得很好,不要引入任何舍入。第55次迭代的实际值是0.599999483215054336332756744377547875046733004150390625
,当使用双精度
和浮点
的0.60000002384185791015625
(在我的系统上)
两者之间的区别在于数字的精确程度,而舍入是让你感到不舒服的地方
顺便说一句,这两个值都不是绝对精确的,它们只是非常接近的近似值,仅此而已。double
更精确
更新
经过几番反复的评论,结果证明浮点运算不需要与.integer(稍加修改)结合使用做得很好,不要引入任何舍入。舍入欺骗了你。如果可能,添加cout最好将文本结果添加为文本。你附加的图像可以写在你问题中的文本代码块中。舍入欺骗了你。添加cout最好添加你的文本如果可能的话,将结果转换为文本。您所附的图像可以用您问题中的文本代码块来编写。谢谢。我正在尝试模拟混沌起作用的动力系统。方程对初始条件非常敏感。微小的变化可能会在未来的迭代中引起巨大的变化。有没有办法解决这个问题是问题吗?你的问题实际上取决于“这个问题”的确切定义。是因为浮点
的行为与双精度
不同?还是因为双精度
的精度不足以满足您的需要?还是因为二进制数不是表示小数的好选择?我担心的是解偏离了其精确值(本例中为0.6)在某个迭代中,导致下一个迭代返回错误的解。是否有方法获得精确值(0.6)在所有的迭代中?是的,有一种方法。不要使用浮点运算。将所有东西乘以10
,然后使用整数。简单、快速、绝对精确。太棒了!谢谢。谢谢。我正在尝试模拟混沌起作用的动力系统。方程对初始条件非常敏感。稍微改变一下就可以因为在未来的迭代中会有巨大的变化。有办法解决这个问题吗?你的问题实际上取决于“这个问题”的确切定义。是因为浮点
的行为与双精度
不同?还是因为双精度
的精度不足以满足您的需要?还是因为二进制数不是表示小数的好选择?我担心的是解偏离了其精确值(本例中为0.6)在某个迭代中,导致下一个迭代返回错误的解。有没有办法在所有迭代中获得精确值(0.6)?是的,有办法。不要使用浮点运算。将所有值乘以10
,然后使用整数。简单、快速、绝对精确。太棒了!谢谢。