2012-02-17 7 views
3

私は10桁の整数からなるテーブルを持っており、BINARY_FLOATとして保存することでOracleのクエリ/演算処理を高速化することを考えました。それはNUMBERよりもCPUにやさしく、メモリを増やすという意味で多くのスペースをとらない(私は思う)。Oracle BINARY_FLOAT:2つの整数は同じ値ですか?

しかし、BINARY_FLOATは2つの異なる数字に対して同じバイト(したがって値)を生成するように見えますが...明らかに機能しません。

例:

私は浮動小数点に入った場合、私はいくつかの問題を抱えているかもしれないが、これらは整数であることが期待
SQL> select dump(to_binary_float(25185387)) from dual; 

DUMP(TO_BINARY_FLOAT(2518538 
---------------------------- 
Typ=100 Len=4: 203,192,38,54 

SQL> select dump(to_binary_float(25185388)) from dual; 

DUMP(TO_BINARY_FLOAT(2518538 
---------------------------- 
Typ=100 Len=4: 203,192,38,54 

SQL> CREATE TABLE blah (somenum BINARY_FLOAT); 
Table created. 

SQL> insert into blah (somenum) values (25185387); 

1 row created. 

SQL> insert into blah (somenum) values (25185388); 

1 row created. 

SQL> select somenum from blah; 

    SOMENUM 
---------- 
2.519E+007 
2.519E+007 

SQL> select to_number(somenum) from blah; 

TO_NUMBER(SOMENUM) 
------------------ 
      25185388 
      25185388 

SQL> select dump(somenum) from blah; 

DUMP(SOMENUM) 
------------------------------------------------------------------------------------------------------------------------ 
Typ=100 Len=4: 203,192,38,54 
Typ=100 Len=4: 203,192,38,54 

。私は、様々な呪文を試してみた - など25185387f、25185387.0、* 1.0 25185387、TO_NUMBER(25185387)、

私はドキュメントを読んで、それを丸め問題になることはできませんので、BINARY_FLOATは、1.79e308に格納する必要があります。

私は64ビットプラットフォームでOracle 11.2.0.3を使用しています。

アイデア?ありがとう。

答えて

3

オラクルの実装はBINARY_FLOAT標準ieee 754. BINARY_FLOATはsingeと同じです。

単一ビットは有意なビットに対してわずか23ビットしか持たない。

25185387 = 11000000001001100011010 (長さ= 25)

25185388 = 11000000001001100011011 (長さ= 25)したがって

最下位ビットを破棄これらのOracleラウンドの重要性、

25185387〜11000000001001100011011 * 2^2

25185388〜11000000001001100011011 * 2^2

はとても同じ値を取得

+0

興味深い... Oracleのドキュメント... http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements001.htm#i140176 ... BINARY_FLOATには、「最大正の有限値」が3.40282E + 38F(私は先にmispastedしていた)と言います。 私はそのサイズまでの番号を保存できると仮定していました。今あなたが何を意味するかを見ます。 2^23を格納できる最大の整数は? 偉大な答えを再度ありがとう。 – raindog308

+0

2^23精度を損なうことなく丸めは増加すると発生します。記号ビットは[正規化フォーム]に保存されます(http://en.wikipedia.org/wiki/Normalized_number)。また、Oracleは数値の「指数」コンポーネントを8ビット(指数記号+ 7ビット)で格納します。最大数= 2 ^(2^7)* 1.111..111≒3.4 * 10^38 – turbanoff

関連する問題