例: 浮動小数点演算の非結合性 - Advanced SQL Engine - Teradata Database

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

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
17.00
Published
2020年6月
Language
日本語
Last Update
2021-03-30
dita:mapPath
ja-JP/zsn1556242031050.ditamap
dita:ditavalPath
ja-JP/zsn1556242031050.ditaval
dita:id
B035-1143
Product Category
Software
Teradata Vantage

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