|
剰余にちなんで割りと最近知ったこと
言語依存性を少なくするために、剰余の計算をMathのメソッドで処理してみようと
思ったことがあり、IEEERemainderは剰余を計算するらしいということで試したのですが
とんでもない仕様であることが分かったことがありました。
Dim a = Math.IEEERemainder(5, 2)
Dim b = Math.IEEERemainder(7, 4)
Dim c = 0
Dim d = Math.DivRem(7, 4, c)
Console.WriteLine(String.Format("a = {0}", a))
Console.WriteLine(String.Format("b = {0}", b))
Console.WriteLine(String.Format("c = {0}", c))
Console.WriteLine(String.Format("d = {0}", d))
この結果ですが、
a = 1
b = -1
c = 3
d = 1
となります。余り-1って・・・。でもこれはこの関数の仕様からすると正しいのです。
7 / 4 = 1.75 で 端数処理すると 2となります。
※端数処理は偶数丸めです。1.5なら2、4.5なら4になるという計算です。
7 - 2 * 4 = -1 と計算するのがIEEERemainderの仕様のようです。これはdouble用の計算なのでそんな
処理になっているんですかね。
7個のおかしを4人で分けるには1個足りないから、もう1つ持ってきて分けようみたいな感じですね。
DivRemを使うと普通に3が返ってきます。
|