簡単な計算をするときに長らく重宝していたのがcalcというソフト。コマンドラインから十分な精度で計算してくれる。非常に便利で、私はここ数年というもの、毎日のように使っていた。
- calc “9**100”
265613988875874769338781322035779626829233452653394495974574961739092490901302182994384699044001 - calc 1/10
0.1 - calc “sqrt(2)”
1.4142135623730950488
別にPython起動してもいいんですけどね。シェルの入力でそのまま計算できるというのは便利なもんです。
しかしFedoraならいいけど、EPELにパッケージがないのでCentOSでは使いにくいという問題があった。しょうがないので自分でrpm作って入れてたんです。
そこに登場したのがPythonのeval()をうまく使ったclacというソフト。似たような使い勝手で、Pythonなので無限桁の整数を苦もなく使える。拡張もやりやすい。ソースはPythonのスクリプト1本なので、Cygwinのような環境にも持ち歩ける(Cygwinのパッケージには入ってませんが)。
これは良い! 非常に!!
…のだけど、
- clac “9**100”
265613988875874769338781322035779626829233452653394495974574961739092490901302182994384699044001 - clac 1/10
0.10000000000000001 - clac “sqrt(2)”
1.4142135623730951
うーむ。浮動小数点の演算で誤差が入るのはどうもアレですよねー。
しかし、拡張可能というのがこういう時に使えることを私は知っている。Pythonには分数や10進演算のモジュールがある。分数は確かPython 2.7以降だから入ってない古い環境もあるかもしれないが。なので、~/.clacrcに以下のように書いておく。
try:
from fractions import Fraction
frac=Fraction
except ImportError,detail:
#old python
pass
from decimal import Decimal
dec=Decimal
これによって、正確に計算することができるのだ。