2016年4月9日土曜日

メモ: ワンライナーで計算

コマンドラインの途中で計算結果をコマンド置換して引数の値に使うときの、ワンライナーで(float 値を含む)計算する方法のメモ。


bc コマンドのワンライナーで計算

小数点以下の桁数を指定するには scale 値を設定する。

  • scale 値とは、式の小数部以下の桁数。
  • -lオプションで起動すると数学ライブラリが読み込まれ、 scale 値が 20 に設定される。

 $ echo '(10+90)/3.0' | bc
33
 $ echo "scale=15; (10+90)/3" | bc
33.333333333333333
 $ echo '(10+90)/3' | bc -l
33.33333333333333333333



awk のワンライナーで計算

小数点以下の桁数は書式で指定可能。フォーマット指定子を使い printf で出力するか、 print 出力の OFMT 値を指定する。 OFMT のデフォルト値は"%.6g"

printf で出力


 $ awk 'BEGIN { printf "%.15f\n", (10 + 90) / 3}'
33.333333333333336

print で出力


 $ awk 'BEGIN { print (10 + 90) / 3}'
33.3333
 $ awk 'BEGIN {OFMT="%.15f"; print (10 + 90) / 3}'
33.333333333333336



perl のワンライナーで計算

print で出力

  • print で出力する場合は、関数に続く括弧は計算の優先順位の括弧とはならない。この場合、関数の引数を指定する括弧と解釈されるようだ。回避するには少しばかりの記述の工夫が必要。

 $ perl -le 'print (10+90)/3.0'
100
 $ perl -le 'print ((10+90)/3)'
33.3333333333333
 $ perl -le 'print +(10+90)/3'
33.3333333333333

printf で出力

  • printf で出力する場合、小数点以下の桁数をフォーマット指定子を使って指定可能。また、引数の計算式も正しく解釈してくれるようだ。

 $ perl -le 'printf "%.15f\n", (10+90)/3'
33.333333333333336



python のワンライナーで計算

Python の float 型は内部で 53bit の精度を持っているそうだ。

式の中に float 値を含めると、計算結果は float 値で返される。


 $ python -c 'print (10+90)/3'                                  
33
 $ python -c 'print (10+90)/3.0'
33.3333333333

float() メソッドで float 値に変換


 $ python -c 'print float (10+90)/3'
33.3333333333
 $ python -c 'print float(10+90)/3'
33.3333333333

書式で桁数を指定

%演算子を使う場合(非推奨)


 $ python -c 'print "%.15f" % ((10+90)/3.0)'
33.333333333333336

format() メソッドを使う場合(推奨)


 $ python -c 'print "{:.15f}".format((10+90)/3.0)'
33.333333333333336



ruby のワンライナーで計算

式の中に float 値を含めると、計算結果は float 値で返される。


 $ ruby -e 'p (10+90)/3'
33
 $ ruby -e 'p (10+90)/3.0'
33.333333333333336

組み込み関数Floatto_fメソッドで float 値に変換して計算

  • Float 直後の空白の有無で結果が違うことに注意。

 $ ruby -e 'p (10+90)/3.to_f'
33.333333333333336
 $ ruby -e 'p Float (10+90)/3'
33.0
 $ ruby -e 'p Float(10+90)/3'
33.333333333333336

組み込み関数 sprintf (または format )を使う

  • 小数点以下の桁数をフォーマット指示子を使って指定可能。
  • String#%メソッドでも可能。

 $ ruby -e 'puts sprintf( "%.10f", (10+90)/3.0)'
33.3333333333
 $ ruby -e 'puts format( "%.15f", (10+90)/3.0)'
33.333333333333336
 $ ruby -e 'puts "%.15f" % ((10+90)/3.0)'
33.333333333333336



まとめ

計算式の記述で気を付ける箇所は括弧が先に来る場合。それが式の括弧なのか、引数の括弧なのか、コマンドによって微妙に違うところに注意。