关于c ++:为什么很多(旧)程序使用floor(0.5 +输入)而不是round(输入)?

Why do lots of (old) programs use floor(0.5 + input) instead of round(input)?

差异存在于返回值中,返回值给出了有关断开连接的输入,我相信,例如以下代码:

1
2
3
4
5
6
7
8
9
10
11
int main()
{
    std::cout.precision(100);

    double input = std::nextafter(0.05, 0.0) / 0.1;
    double x1 = floor(0.5 + input);
    double x2 = round(input);

    std::cout << x1 << std::endl;
    std::cout << x2 << std::endl;
}

哪些输出:

1
2
1
0

但它们最终只是不同的结果,一个人选择了自己喜欢的结果。我看到很多"老"C/C++程序使用EDCOX1,0,而不是EDCOX1,1。

有什么历史原因吗?CPU上最便宜的?


std::round是introduced在C + + 11。在这std::floor是只读的,所以程序员都是可用的,使用它。 </P >


好的,有历史的原因whatsoever。。。。。。。本种有越轨行为已经不是从每年的点。民间做这个,当他们的感觉是非常,非常顽皮。它是一个严重的滥用空中浮点数,和许多experienced专业程序员,秋天它的方法。夏娃的Java bods做到1.7版本。有趣的家伙。 </P >

我猜想这是一个decent门诊中盒的德国rounding函数是不可用的,直到formally C + +(11 despite C让科学在C99),但这是真的很好的方法adopting原谅的所谓的另类。 </P >

这里的东西:floor(0.5 + input)并不总是恢复,同样的结果为相应的std::round呼叫!!!!!!! </P >

的原因是quite微妙的:cutoff点A的德国rounding,a.5的整数a是,通过一个coincidental性质的宇宙,一个理性的二元。这可以作为represented exactly IEEE754浮在一点上的权力,第52 2,和thereafter rounding是一个好的作品呢,std::round总厂恰当。用于其他浮点方案的咨询文件。 </P >

0.5综合到一个doubleCAN introduce imprecision致因的slight下或overshoot方法的一些值。如果你认为关于它的双double值,综合在一起,是在inception大学unwitting十进制conversions和运用的一个函数,这是一个非常强大的函数的输入(如A rounding function),是结合到端的眼泪。 </P >

不做它。 </P >

参考:为什么不math.round(0.49999999999999994)返回1 </P >


我认为这是在你的错误: </P >

But they are just different results in the end, one chooses its
preferred one. I see lots of"old" C/C++ programs using floor(0.5 +
input) instead of round(input).

这是不是的情况。你必须选择在右键rounding方案域。在一个金融应用程序,你将使用的圆banker’s规则(不使用浮顺便)。当采样,然而,rounding上使用static_cast(floor(f + .5))YIELDS;取样比,这increments的动态范围。当pixels对准,即转换到屏幕坐标的位置,使用的任何其他方法,将rounding高产孔,差距,和其他artifacts。。。。。。。 </P >


一个简单的原因,有可能是不同的方法rounding数,除非你知道的方法的使用,你可以不同的结果。 </P >

楼(…),你可以做洽与结果。如果是浮动的。5、大增,它会撞到下一整数。但.49999威尔是下拉的小数点。 </P >


许多程序员适应他们learned习语,当与其他编程语言。不是所有的语言有一个round()函数,和在这些语言,它的正常的使用floor(x + 0.5)作为代用品。当这些入门的程序员用C + +,他们不总是realize那有一个内置在round(),继续他们的方式,他们使用的是用来。 </P >

在其他的话,只是因为你看到很多关于说不的时候,它并不' t均有一个很好的理由去做它。你可以找到例子的这段在每一种编程语言。记得鲟鱼的法律: </P >

ninety percent of everything is crap