四捨五入の実装って地味に面倒なんじゃないか? という話

C言語だと round() とかが整備されたのって C99 からじゃないかと思うんだが、 まぁまぁ詳しい事情は置いておくとして 二十年くらい前までって四捨五入って当たり前に個々に実装してたような記憶がある。 で、その実装もたいてい 「0.5足して切り捨てればいいじゃん」 という実装だったと記憶している。 別に間違ってないんだけど、これってその型が表現できる最大値から 0.5 以内のところって たぶん正しく動作しないよね??

そのへんはどうしてたんだろうか…

まさに「個々に実装してた」の「個々」の事情で 最大値スレスレにならなきゃ問題にならないからいいってことなんだろうか…。

というのを

GitHub - MinoruSekine/libfixedpointnumber: Library for fixed point number by C++11

の実装を思案してて気になったのでした…。

まぁ「0.5足して切り捨てる」だけだと値が負のときの動作が JIS Z8401 相当になることは諦めてるわけで、 その時点で「個々」の事情で起き得ないところは動作の正しさを諦めてるってことか…。