Re: [請益] 如何直接判斷浮點數運算時有誤差(贈P幣)

作者: oopFoo (3d)   2018-12-02 21:35:39
你已經知道答案了,但你可能還不知道原理。
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。
作者: CorkiN (柯基)   2018-12-02 22:15:00
應該說,有念過計組的就會知道
作者: Muscovy (三分熟的鬧鐘)   2018-12-03 00:13:00
01234 捨, 56789 入, 一半一半看起來很公平啊.考慮連續區間也是, [0, 5) 捨, [5, 10) 入, 也是很公平.為什麼會說「四捨五入是 biased」? 是有什麼特別原因嗎?路過純好奇.
作者: guest0079 (SpongeBob SquarePants)   2018-12-03 03:47:00
樓上 哪有一半一半 零捨去得零算在01234那一半湊了五個 但0變0根本什麼都沒有捨去
作者: KeyFSN ( ~☼☽✩☁~ )   2018-12-03 16:29:00
專業
作者: v420746k (Tyrone_Huang)   2018-12-03 18:20:00
作者: Muscovy (三分熟的鬧鐘)   2018-12-04 19:49:00
呃, 0 包含 0~0.1 之間的所有可能啊, 不要只看 0.

Links booklink

Contact Us: admin [ a t ] ucptt.com