2017-04-13 2 views
3

IEEE 754の単精度と倍精度のデータ型がどれほど優れているのかよく知っています。私はすべてのコンピュータ科学者が浮動小数点演算について知っておくべきことに関する記事を読んだが、私はPostgreSQLが作る選択について困惑している。PostgreSQLがフィルタリングするデータ型を決定する要因は何ですか?

gsh=# explain select count(*) from ttt where f4=12.206; 
         QUERY PLAN       
---------------------------------------------------------- 
Aggregate (cost=23.77..23.78 rows=1 width=0) 
    -> Seq Scan on ttt (cost=0.00..23.75 rows=6 width=0) 
     Filter: (f4 = 12.206::double precision) 
(3 rows) 
:私は説明をお願い

select count(*) from ttt where f4=12.206; 
count 
------- 
    0 
(1 row) 

insert into ttt (f4,f8,fn) values(12.206,12.206,12.206); 

私は、クエリを実行します。

は私が

create table ttt(f4 float4, f8 float8, fn numeric); 

私はいくつかの値を追加するテーブルを作成します

したがって、照会では、1235のdouble precsionバージョン を単一の前提条件として格納された値に一致させようとしていますが、一致するのは ではありません。これは驚くべきことではありません。 12.206に対して を比較したフィルターではありませんなぜ

gsh=# select 12.206; 
?column? 
---------- 
    12.206 
(1 row) 

gsh=# select pg_typeof(12.206); 
pg_typeof 
----------- 
numeric 
(1 row) 

番号は、デフォルトでは、数値として扱われている場合:私には驚きは何

デフォルトのPostgreSQLで が数値として数値を扱うように見えるので、ということです倍精度の代わりに数値として?私はこれが少なくとも驚きの違反だと思う。

どのような考えですか?

答えて

1

これは、type resolution rules for operatorsで説明できます。

正しく表示されているように、式の=演算子の左側の型はrealで、右側の型はnumericです。

numericからdouble precisionrealへとrealからdouble precisionへの暗黙のキャストがあります(psqlに“ \dCS ”に確認してください)。 利用可能な=オペレータ(“ \doS = ”にpsql)を調べると、手順3.aの後に表示されます。

ステップ3.c.では、左側の入力タイプに正確に一致するため、最初の演算子が選択されます。

あなたは

... WHERE f4 = 12.206::real 

または

... WHERE f4 = REAL '12.206' 
のように、 real定数を使用して real = realオペレータの使用を強制することができます
関連する問題