前のページ|次のページ

COMPFUZZ関数

2つの数値をファジー比較します。

カテゴリ: 数学

構文

COMPFUZZ(value–1, value–2 <, fuzz <, scale>>)

必須引数

value–1

比較対象の2つの数値のうち1番目の数値を指定します。

value–2

比較対象の2番目の数値を指定します。

オプション引数

fuzz

比較の相対しきい値を指定する負でない数値です。1以上の値はマシン精度の倍数単位で扱われます。

デフォルト 1024

scale

スケール係数を指定します。

デフォルト MAX (ABS (value–1), ABS (value–2))

詳細

COMPFUZZ関数は、4つの引数をすべて指定した場合、次の値を返します。
  • –1 (value–1 < value–2 – thresholdの場合)
  • 0 (ABS(value–1 - value–2) ≤ thresholdの場合)
  • 1 (value–1 > value–2 + thresholdの場合)
次の関係が存在します。
  • 0 ≤ fuzz < 1のとき、threshold = fuzz * ABS(scale)
  • 1 ≤ fuzz < 1 / CONSTANT('MACEPS')のとき、threshold = fuzz * ABS(scale) * CONSTANT('MACEPS')
COMPFUZZは浮動小数点のアンダーフローまたはオーバーフローを回避します。

比較

COMPFUZZ関数は2つの浮動小数点の数値を比較し、比較に基づく値を返します。ROUND関数は、第2引数の倍数にきわめて近い値に引数を丸めます。結果は第2引数の正確な倍数でない場合があります。

浮動小数点計算では、数値を加算する順番によって合計値が異なる場合があります。x1からxnまでのn個の数値の和を計算するときの、ある浮動小数点エラーの近似境界は次の式で表されます。
n * machine_precision * sum (abs(x1) + ... + abs(xn))
したがって、n個の浮動小数点の数値の和をCOMPFUZZ関数で比較するのに、次のDATAステップに示すように、nをファジー値、絶対値の和をスケール係数として使用できます。
data _null_;
   x1 = -1/3;
   x2 = 22/7;
   x3 = -1234567891;
   x4 = 1234567890;
      /* Add the numbers in two different orders. */
   sum1 = x1 + x2 + x3 + x4;
   sum2 = x4 + x3 + x2 + x1;
   diff = abs(sum1 - sum2);
   put sum1= / sum2= / diff=;
      /* Using only a fuzz value gives the wrong result. The fuzz value  */
      /* is 8 because there are four numbers in each sum, for a total of */
      /* eight numbers.                                                  */
   compfuzz = compfuzz(sum1, sum2, 8);
   put "fuzz only (wrong):         " compfuzz=;
      /* Using a fuzz factor and a scale value gives the correct result. */
   scale = abs(x1) + abs(x2) + abs(x3) + abs(x4);
   compfuzz = compfuzz(sum1, sum2, 8, scale);
   put "fuzz and scale (correct):  " compfuzz=;
run;
次の出力がログに書き込まれます。
COMPFUZZ関数のSAS出力の一部
sum1=1.8095238209 sum2=1.8095238095 diff=1.1353266E-8 fuzz only (wrong):         compfuzz=1 fuzz and scale (correct):compfuzz=0

関連項目:

前のページ|次のページ|ページの先頭へ