作者oopFoo (3d)
看板Soft_Job
标题Re: [请益] 如何直接判断浮点数运算时有误差(赠P币)
时间Sun Dec 2 21:35:39 2018
你已经知道答案了,但你可能还不知道原理。
round "half" to nearest even. 又称gaussian/banker's rounding.
例子
round[{0.5, 1.5, 2.5, 3.5, .5}] =>{0, 2, 2, 4, 4}
为什麽呢?因为四舍五入是biased. (.5)是刚好在(0,1)的一半(half)。
要公平,不累进error,其实要一半舍,一半入。最简单的方法就是odd或even入,有一半的机会。
banker's rounding 其实蛮常见的。
.net Math.round的 default 就是banker's rounding.
java也可以设定
https://docs.oracle.com/javase/8/docs/api/java/math/RoundingMode.html
floating point 的话就
010....(不到一半,舍)
101....(超过一半,入)
100....(刚好一半,用banker's rounding)看要round的bit是1或0.
硬体的floating point会有3个extra bits. guard, round, sticky. sticky bit 是or所有多出的bits.
2个bits不够,因为做完arithmatic还需要normalized 回来。
请参考
http://pages.cs.wisc.edu/~david/courses/cs552/S12/handouts/guardbits.pdf
金融业,应该都知道这个吧。
PS: "What Every Computer Scientist Should Know About Floating-Point Arithmetic"
https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
主要在在讨论rounding error。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 59.115.126.26
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1543757742.A.357.html
1F:推 CorkiN: 应该说,有念过计组的就会知道 12/02 22:15
念计组应该要知道。写金融数字的也需要知道bankers rounding.
2F:推 Muscovy: 01234 舍, 56789 入, 一半一半看起来很公平啊. 12/03 00:13
3F:→ Muscovy: 考虑连续区间也是, [0, 5) 舍, [5, 10) 入, 也是很公平. 12/03 00:14
4F:→ Muscovy: 为什麽会说「四舍五入是 biased」? 是有什麽特别原因吗? 12/03 00:14
5F:→ Muscovy: 路过纯好奇. 12/03 00:14
6F:推 guest0079: 楼上 哪有一半一半 零舍去得零算在01234那一半凑了五 12/03 03:47
7F:→ guest0079: 个 但0变0根本什麽都没有舍去 12/03 03:47
如g大所讲。(1234)(5)(6789)这样才是平衡。
※ 编辑: oopFoo (36.231.141.178), 12/03/2018 10:30:29
8F:推 KeyFSN: 专业 12/03 16:29
9F:→ v420746k: 推 12/03 18:20
10F:推 Muscovy: 呃, 0 包含 0~0.1 之间的所有可能啊, 不要只看 0. 12/04 19:49