差异存在于返回值中,返回值给出了有关断开连接的输入,我相信,例如以下代码:
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;
} |
哪些输出:
号
但它们最终只是不同的结果,一个人选择了自己喜欢的结果。我看到很多"老"C/C++程序使用EDCOX1,0,而不是EDCOX1,1。
有什么历史原因吗?CPU上最便宜的?
- STD:回合从零开始移动一半。这在数学上是不统一的,比如地板(F+.5),中间的箱子总是朝上。使用楼层法的原因是,在工程界,需要进行适当的四舍五入。
- @米夏&235;勒罗伊,你能举个例子吗?"在工程界,这是正确取整的必要条件。"
- 如在圆()中所指出的,C++中的前C+11中的浮点数我们没有圆。正如我在回答中指出的,正确地写下你自己的一轮是一个困难的问题。
- 为什么STD::NEXTFFER(0.05,0)/0.1;而不是STD::NEXTFFER(0.5,0);它不应该产生同样的结果吗?显然是这样的:coliru.stacked-crooked.com/a/9bf4f15072e81cb9是一种红鲱鱼。
- @阿恩使用STD::()()0.5和+4的舍入值之间的距离是2。使用地板,它是1。只有当两个值的符号相反时才会发生。当你试图画直线,或者让你选择错误的纹理像素时非常恼人。
- 一些编程语言和环境(包括.NET)使用了一种称为Banker's Rounding的欺骗方法,其中x.5取整到最接近的偶数。所以0.5转为0,1.5转为2。您可以想象这会在调试时引起混乱。我认为这个邪恶的"特性"的解决方案是根本没有.round()函数,而是有.roundbankers()、.roundhalfup()、.roundhalfdown()等(或.bankersround()等,但intellisense更适合.roundbankers())。至少那样的话,你会被迫知道该期待什么。
- @用户368当然是强制人们明确的一个选项。但如果你不这样做,那么使用银行家的四舍五入法要比任何其他方法都要好得多,因为在对多个数字进行四舍五入时,其他方法都会导致不必要的偏离真实平均值。很明显,人们不太关心他们想要什么,所以你最好给他们最好的选择。
- @VOO:可以有一个舍入方案来保证圆(x)==-圆(-x),或者保证圆(x+n)==圆(x+n)在x+n完全可表示的情况下。如果没有一个预先定义的银行舍入函数,那么实现银行舍入会比较困难,因此,对于银行舍入来说,预先定义的函数比半个半个半圆的函数更有价值,但是对于许多常见的用途来说,后者实际上更好。
- @user3685427.net的Math.Round函数允许您在ToEven和AwayFromZero之间进行选择,后者向上舍入正数,向下舍入负数。
- 除非有确凿的证据支持这个问题所基于的论断,否则这个问题就不在讨论范围之内。
- @用户3685427:在金融和统计应用程序中,需要消除从零取整引入的微妙和系统性向上偏差,而银行家取整是必要的。如果没有硬件浮点实现的实际知识,几乎不可能实现,因此在C中选择它作为默认值。
- @超级卫星为什么"更好"?在某些情况下,向用户显示原始值和舍入值可能会减少对平均用户的混淆,但舍入到更高会带来明显的统计偏差,除了稍微容易一些之外,没有任何其他优势。
- 对浮点数进行舍入有许多不同的模式。如果不检查"round"函数的作用,只取它的任何一个函数,你就不知道会得到什么样的取整模式。
- @VOO:当一个数取整为a+b*n(整数n)形式的多个值时,b将是一个整数或一个二分母小幂的分数,具有连续等距值组的情况下,例如,[-3、-2、-1、0、1、2、3]或[-2,-2,-1,-1,0,0,1,1,2,2]可能比让它们显示为[-4,-2,-2,0,0,2,2]或[-2,-2,-2,-1,0,0,0,1,2,2]要好。银行家的四舍五入作为一种浮点四舍五入模式是很好的,并且在某些数字到字符串的情况下是合适的,但在某些情况下,更统一的方法会更好。
- @Micha&235;lroy:这就是为什么你应该使用nearbyint()(使用当前的舍入模式)而不是round()(在中途情况下总是使用远离零)。
- @帕特尔。依靠一种未知的四舍五入模式来做数学?
std::round是introduced在C + + 11。在这std::floor是只读的,所以程序员都是可用的,使用它。 </P >
- 没有什么。但它比C++ 11要老。我认为C++在11之前得到它是合乎逻辑的。就这些;)
- @ MalZZZ——C++标准库不自动继承C的标准库。有仔细挑选的过程。他们花了12年时间才与C99同步。
- @最好不要把这两种语言混在一起。
- @哈克斯:是的。IMHO C在C++到11的数学函数方面领先于C++。
- 重要的是要注意的是,该方法被用于一些输入的中断,并且C++ 11依赖于C99,而C++ 03依赖于C90,这类代码转到@ MARZZZ点。
- @马库兹:你的评论很到位(尽管有批评)。问题是,在没有C++标准的情况下存在着很大的差距,第一个C++标准是C++ 98,第一个主要修订是C++ 11。有一个小更新,C++ 03,但维基百科页面指出,它主要是一个"bug修复"版本。因此,C++ 11是13年后的第一次赶上C标准库的机会。
好的,有历史的原因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 >
- 评论不用于扩展讨论;此对话已被移动到聊天。
- nearbyint()通常比round()更好,因为nearbyint使用当前的舍入模式,而不是从round()的零开始的时髦分层(尽管ARM支持,但x86甚至没有硬件支持)。两者在C++ 11中都被添加到C++中。
我认为这是在你的错误: </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 >
- +1这个答案的关键是对这个问题的评论,其中对round()所做的事情存在分歧。
- @但亚伦对以东十一〔五〕所作的回答是错误的。
- 哦,哈!好的接球。真是讽刺。"因为我们不同意或者不完全了解Y,所以使用更好的X。"那么当X也适用时,你会怎么做?
- @亚伦,放轻松。你只需要做一件理智的事情,然后使用nearbyint(x),它使用理智的(最接近的)四舍五入,前提是你没有弄乱浮点环境。
- @EOF:你的舍入选择是不明智的。在非线性分量中没有周期1的舍入函数是疯狂的。
- @EricTowers你真的打算宣称IEEE754浮点的默认舍入是疯狂的吗?
- @EOF:是的。我不是银行家。我用"常用的四舍五入法"。
- @埃里克塔斯,我希望你不要介意系统性的错误——我知道。
- @EOF:没有系统错误。每个图像都是一致的。
- @EricTowers和EOF:两种舍入方法(以及除这两种方法之外存在的其他方法,其中floor是一种)都是健全的;它们只是不适用于相同的用例。有时正常的四舍五入是合适的,有时四舍五入到最近的偶数是更合适的,这样在统计中就不会有偏差,有时四舍五入到地板是正确的。如果你不使用floor(x+0.5),那么我认为很明显你需要使用正常的方法,尽管一个叫嚷为什么"to even"可以避免偏倚(因为0.5的特殊治疗)是合理的(如果它不偏离OP的主题)。
许多程序员适应他们learned习语,当与其他编程语言。不是所有的语言有一个round()函数,和在这些语言,它的正常的使用floor(x + 0.5)作为代用品。当这些入门的程序员用C + +,他们不总是realize那有一个内置在round(),继续他们的方式,他们使用的是用来。 </P >
在其他的话,只是因为你看到很多关于说不的时候,它并不' t均有一个很好的理由去做它。你可以找到例子的这段在每一种编程语言。记得鲟鱼的法律: </P >
ninety percent of everything is crap