2010年6月19日土曜日

数値計算関数使用時の注意点まとめ - AWK

AWKの数値計算関数と関連機能
**** 処理系共通の注意点
o 表示する値の精度は、処理系によって異なります。でも、内部的には同じ精度になっているみたいです。
   + 表示の桁数が少ない時は、printfsprintfなどを使って、書式付きで値を表示してみます。
o 計算結果が 0に近い時、計算誤差が上位桁に上ってきている事があります。
   + 必要に応じて、計算結果を丸めたり、計算方法を工夫します。
o 数値比較などの場面で、値を文字列だと認識されてしまった時は、値の後ろに「 + 0」を追加すると数値化出来ます。

o この他、数値計算そのものには関係がありませんが、有効数字7桁以上を扱う場合、数値の表示桁数を伸ばしておくと、ストレスが溜まりません。
   + 例えば、数値の最大表示桁数(及び、文字列に自動変換する時の最大桁数)を10桁に変更する場合
--------
BEGIN {
  OFMT = "%.10g";
  CONVFMT = "%.10g";
(以下、必要な処理)
}
--------

   + 詳しくは、「数値から文字列にする時に、実数を7桁以上表示させる方法
   + なお、AWKの数値計算時の有効数字は、最大15桁程度です(= 32ビットOS用にコンパイルした場合)。それよりも長く表示させても、あまり意味がありません。


**** 特定の処理系に関する注意点
** Gawk系特有の動作
o 一部の関数を呼び出す時、注意点があります。(exp / rand
o srand関数で種を指定すると、整数部分だけ使います。

** mawk系特有の動作
o 有効範囲外の値について、関数呼び出し前のチェックが必要になる事があります。
   + 「有効範囲の限界に近い値」や「想定外の値」が入ると、AWKプログラムを強制終了する関数がありました。(log。mawk MBCS (32bit版) 1.3.3の場合は、次の関数も追加。sqrt / exp

** オリジナルAWK特有の動作
o 不正な値を指定して連続で呼び出すと、返す値が変わる関数がありますので、注意します(sqrt / log)。
o この他、srand関数の戻り値が、他の処理系と異なります。


==
関連ページ:
    ▼AWKの数値計算関数と関連機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > 数値から文字列にする時に、実数を7桁以上表示させる方法
    AWKプログラムの中で、8進数や16進数を使う方法
    int = 実数や文字列を整数化する
    +
    配列を使う時の注意点まとめ
(2010年8月18日追加。数値の表示桁数を増やす方法)
(2010年6月22日追加。オリジナルAWKで値が変化する条件)