繁体   English   中英

C ++ Visual Studio Express 2012中的舍入错误

[英]Rounding error in C++ Visual Studio Express 2012

我在尝试用C ++编写自己的舍入函数时遇到了一个非常奇怪的功能。

以下两个函数均产生0.000作为输出。

double round ( double x, int y)
{
    double value = 0;

    value = floor(x*pow(10, y) + x>=0?0.5:-0.5)/pow(10, y);

    return value;
}

double round3(double x)
{
    double value = 0;

    value = floor(x * 1000 + x>=0?0.5:-0.5) / 1000;

    return value;
}

但是,此函数产生正确的输出,四舍五入到小数点后三位。

double round(double x)
{
    double value = 0;

    if (x >= 0){
        value = floor( x*1000 + 0.5 )/1000;
    }
    else{
        value = floor( x*1000 - 0.5 )/1000;
    }
    return value;
}

有人能启发我为什么会这样吗?

三元运算符?:优先级较低,这

x * 1000 + x>=0?0.5:-0.5

等效于:

(x * 1000 + x>=0)?0.5 :-0.5

结果为0.5-0.5

前两个具有运算符优先级错误,例如(x * 1000 + x>=0?0.5:-0.5) / 1000的评估为(((x * 1000 + x) >= 0) ? 0.5 : -0.5) / 1000 ,当x为正数时为0.0005,当x为负数时为-0.0005。

还要记住,双精度的“四舍五入”是一项棘手的事情……通常会因为第15位或第16位错误而出现错误,无论是因为无法表示所执行操作的“数学上完美的”结果恰好在double变量中,或者由于中间值或pow等数学函数的近似值,因此您可能会发现自己认为是“ n.5”的值有时会四舍五入。 如果对此感到困惑,请阅读每位计算机科学家应该了解的有关浮点算法的内容

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM