Pythonでmath.floor()とmath.ceil()の誤差を回避する

Pythonでは割り算をすると返り値はfloatとなる。

floatの精度は倍精度の64bitで、16桁ほどしか精度が担保されない。

一方で整数型は精度の上限がなく、何桁でも精度が保たれる。

整数には精度の制限がありません。

浮動小数点型はたいていは C の double を使って実装されています。

https://docs.python.org/ja/3/library/stdtypes.html#numeric-types-int-float-complex

math.floor()やmath.ceil()で切り上げや切り下げを行うと、16桁を超える計算を行う場合に誤差が生じてしまう。

でも精度を気にしてdecimalを使うのは面倒くさい。

なんとかintだけで計算したいので、以下のように書き換えてみる。

import math

math.floor(x)
-> x // 1

math.ceil(x)
-> -(-x // 1)

このように切り捨て除算を活用すればfloatを経由せずに切り捨て切り上げが可能になり、import mathする必要もなくなる。

ceilの書き換えがやや難解だが、ceilは「x以上の最小の整数を返す」という挙動を考えれば納得できるはず。

参考

組み込み型 — Python 3.8.6 ドキュメント

コメント

タイトルとURLをコピーしました