16.20 - 例: 浮動小数点演算の非結合性 - Teradata Vantage NewSQL Engine

Teradata Vantage™ データ タイプおよびリテラル

prodname
Teradata Database
Teradata Vantage NewSQL Engine
vrm_release
16.20
category
プログラミング リファレンス
featnum
B035-1143-162K-JPN

2つの浮動小数点数列に、同じ値を別々の順序で挿入された以下のテーブルを考察します。

CREATE TABLE t1 (i INTEGER, a FLOAT, b FLOAT);
INSERT t1 (1, 1000.55, 2000.7);
INSERT t1 (1, 2000.4, 2000.1);
INSERT t1 (1, 2000.1, 2000.4);
INSERT t1 (1, 2000.7, 1000.55);

以下のSELECT文の条件式は、2つの列の値の合計を比較しています。

SELECT i, SUM(a) as sum_a, SUM(b) as sum_b
FROM t1
GROUP BY i
HAVING sum_a <> sum_b;

2つのSUM計算で使われる値は同じなので、行は戻されないのは明らかです。ただし、結果は次のようになります。

          i                   sum_a                   sum_b
-----------  ----------------------  ----------------------
          1   7.00175000000000E 003   7.00175000000000E 003

この計算には、目に見えないエラーが紛れ込んでいます。以下の文で、そのエラーを示します。

SELECT ABS(SUM(a) - SUM(b)) FROM t1;

結果は以下のようになります。

Abs((Sum(a)-Sum(b)))
----------------------
 1.81898940354586E-012