【问题标题】:Issue when comparing two IloNum values比较两个 IloNum 值时出现问题
【发布时间】:2019-02-21 20:17:14
【问题描述】:

以下sn-p的代码:

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&gt;j)=1

我是否忽略了文档中的一些细节或者这是一个错误?

【问题讨论】:

    标签: cplex ilog


    【解决方案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
    

    【讨论】:

    • 我知道与浮点运算相关的固有不精确性,但我希望在打印 ij 时会看到这种不精确性。我没想到要从i 中减去 4.8 来查看它与零的偏差。谢谢。
    猜你喜欢
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    相关资源
    最近更新 更多