我在尝试用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) / 1000
被评估为(((x * 1000 + x) >= 0) ? 0.5 : -0.5) / 1000
,因此当x
正数时x
为0.0005 ,而当负数时为-0.0005 。
还要记住,双精度的“四舍五入”是一项棘手的事情……通常会因为第15位或第16位错误而出现错误,因为是否无法表示所执行操作的“数学上完美的”结果恰好在double
变量中,或者由于中间值或数学函数(例如)的近似值pow
,因此您可能会发现自己认为是“ n.5”的值有时会四舍五入。如果对此感到困惑,请阅读每位计算机科学家应该了解的有关浮点算法的内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句