比较两个 IloNum 值时出现问题
Issue when comparing two IloNum values
以下代码片段:
IloNum i = 2*0.6 + 3*0.4 + 0.6 - 0.4 + 1 + 0.6 - 0.4 + 1;
IloNum j = 4.8;
cout << "i=" << i << ", j=" << j << ", (i>j)=" << (i > j) << endl;
具有以下输出:
i=4.8, j=4.8, (i>j)=1
我是否忽略了文档中的一些细节,或者这是一个错误?
你应该记住,一旦你做了一些浮动操作,你就会有一些小错误。
如果我用 OPL 重写你的模型
float i = 2*0.6 + 3*0.4 + 0.6 - 0.4 + 1 + 0.6 - 0.4 + 1;
float j = 4.8;
execute
{
writeln("i=" , i , ", j=" ,j ,", (i>j)=" , (i > j) );;
}
float i2=i-4.8;
float j2=j-4.8;
execute
{
writeln("i2=",i2);
writeln("j2=",j2);
}
然后我得到
i=4.8, j=4.8, (i>j)=true
i2=8.881784197e-16
j2=0
这显示了导致看似悖论的微小不精确性
让我强调一下
float i = 2*6 + 3*4 + 6 - 4 + 10 + 6 - 4 + 10;
float j = 48;
execute
{
writeln("i=" , i , ", j=" ,j ,", (i>j)=" , (i > j) );;
}
float i2=i-48;
float j2=j-48;
execute
{
writeln("i2=",i2);
writeln("j2=",j2);
}
给予
i=48, j=48, (i>j)=false
i2=0
j2=0
以下代码片段:
IloNum i = 2*0.6 + 3*0.4 + 0.6 - 0.4 + 1 + 0.6 - 0.4 + 1;
IloNum j = 4.8;
cout << "i=" << i << ", j=" << j << ", (i>j)=" << (i > j) << endl;
具有以下输出:
i=4.8, j=4.8, (i>j)=1
我是否忽略了文档中的一些细节,或者这是一个错误?
你应该记住,一旦你做了一些浮动操作,你就会有一些小错误。
如果我用 OPL 重写你的模型
float i = 2*0.6 + 3*0.4 + 0.6 - 0.4 + 1 + 0.6 - 0.4 + 1;
float j = 4.8;
execute
{
writeln("i=" , i , ", j=" ,j ,", (i>j)=" , (i > j) );;
}
float i2=i-4.8;
float j2=j-4.8;
execute
{
writeln("i2=",i2);
writeln("j2=",j2);
}
然后我得到
i=4.8, j=4.8, (i>j)=true
i2=8.881784197e-16
j2=0
这显示了导致看似悖论的微小不精确性
让我强调一下
float i = 2*6 + 3*4 + 6 - 4 + 10 + 6 - 4 + 10;
float j = 48;
execute
{
writeln("i=" , i , ", j=" ,j ,", (i>j)=" , (i > j) );;
}
float i2=i-48;
float j2=j-48;
execute
{
writeln("i2=",i2);
writeln("j2=",j2);
}
给予
i=48, j=48, (i>j)=false
i2=0
j2=0