lcalc
名前
lcalc : 高精度10進演算(整数18桁+小数18桁)を行う
書式
使い方とオプション
Usage
lcalc <script> <files>...
Option
--divzero[=<string>] --overflow[=<string>] --outdomain[=<string>] -d
説明
引数のファイル又は標準入力のテキストデータの各フィールドに対して、<script> にしたがった演算を行います。<script> では、式、フィールド、フィールド範囲を単独またはカンマ(,)で区切って複数指定することができます。
式の演算は、整数18桁+小数18桁 の36桁で行われます。式では、定数、NF(入力フィールド数)、NR(入力レコード数)、組込関数(round() age() sage() ceil() floor() sqrt())、単項演算(- ! $)、二項演算(+ - * / % **)、比較(< <= > >= == !=)、論理 AND(&&)、論理 OR(||)、条件演算(? :)、括弧を使うことができます。冪乗演算子 ** の代わりに ^ を使うことができます。
$ 演算子は入力のフィールドを表します。オペランドは整数に切り捨てられます。切り捨てられた結果が 1 〜 NF の範囲になければなりません。
丸め関数は、round() 四捨五入、age() 切り上げ、sage() 切り捨て を行います。第1引数の値を、第2引数で指定される桁位置で丸めます。第2引数は整数定数のみが許されます。第2引数が 0 で始まる場合は整数部分の桁位置を、0 以外で始まる場合は小数部分の桁位置を示します。例えば、sage(123.456, 01) は 120.000になり、sage(123.456, 1) は 123.400 になります。
天井関数 ceil()、床関数 floor() は、それぞれ引数を下回らない最小の整数、引数を上回らない最大の整数を求める関数です。
平方根関数 sqrt() は、平方根を求める関数です。
式の出力形式は 整数部.小数部 です。整数部は必要な桁数(1〜18)、小数部は常に18桁です。ただし、演算結果が整数になる場合は、小数点及び小数部は表示されません。
論理 AND は、左辺が 0 の場合は結果が 0 になります。左辺が 0 以外の場合は右辺の値が結果になります。論理 OR は、左辺が 0 以外の場合はその値が結果になります。左辺が 0 の場合は右辺の値が結果になります。
フィールドは、「$ 式」の形式で、入力のフィールドそのままの文字列を表します。式の値は整数に切り捨てられます。切り捨てられた結果が 0 〜 NF の範囲になければなまりせん。0 の場合は入力行全体となります。$ 演算子との違いは、数値に変換されるか、文字列のままかです。例えば、スクリプトが ‘$1, ($2)’ で、 入力が
123.456 123.456
の場合、出力は
123.456 123.456000000000000000
となります。
フィールド範囲は、$[式1:式2] の形式で、式1 〜 式2 の連続した入力フィールドを表します。式1 > 式2 の場合、逆順に表示されます。式1、式2 ともに整数に切り捨てた値が 1 〜 NF の範囲になければなりません。
スクリプトの構成要素間には任意個の空白類(改行文字を含む)を置くことができます。
- から行末まではコメントになります。コメントは空白を置ける場所に置くことができます。
除算、剰余算において、右オペランドが 0 の場合は、演算結果が 0 になります。–divzero オプションを指定した場合は、その演算を含む式の計算が放棄され、オプションで指定された文字列が出力されます。文字列の指定を省略した場合は div/0 が出力されます。
式の計算でオーバーフローが発生した場合は、lcalc の実行が中止されます。–overflow オプションを指定した場合は、その式の計算が放棄され、オプションで指定された文字列が出力されて、lcalc の実行が継続されます。文字列の指定を省略した場合は ovflw が出力されます。
平方根関数の引数や冪乗演算の被演算子が不当な値の場合、lcalc の実行が中止されます。–outdomain オプションを指定した場合は、その式の計算が放棄され、オプションで指定された文字列が出力されて、lcalc の実行が継続されます。文列の指定を省略した場合は outdm が出力されます。
-d オプションを指定すると、ファイルを読み込まず、スクリプトを直接実行します。この場合、$演算子、フィールド、フィールド範囲は使えません。
例(その1)
通常の使い方
$ cat data 01 埼玉県 91 59 20 76 54.1 01 埼玉県 46 39 8 5 21.2 01 埼玉県 82 0 23 84 10.3 02 東京都 30 50 71 36 30.4 02 東京都 58 71 20 10 6.5 04 神奈川県 92 56 83 96 75.6 $ lcalc '$1, $2, $3 / $4 + $5 * $6' data 01 埼玉県 1521.542372881355932203 01 埼玉県 41.179487179487179487 01 埼玉県 1932 02 東京都 2556.600000000000000000 02 東京都 200.816901408450704225 04 神奈川県 7969.642857142857142857
第1、2フィールドは指定全体が「$ 式」の形式なので、文字列としてそのまま出力されます。第3フィールドは式として計算が行われます。
例(その2)
電卓的な使い方
$ lcalc -d '1.23 * 3.45 / 3' 1.414500000000000000
Version and Edition
Version : Wed Jan 13 10:24:18 JST 2021
Edition : 1
© 2021 Universal Shell Programming Laboratory site