Oracle二进制浮点:2个整数给出相同的值?

Oracle二进制浮点:2个整数给出相同的值?,oracle,oracle11g,Oracle,Oracle11g,我有一个满是10位整数的表,我想通过将它们存储为二进制浮点数来加速Oracle中的查询/数学运算。这比数字对CPU更友好,不会占用太多空间(我认为),这意味着内存中会有更多数据 然而,二进制浮点数似乎会为两个不同的数字产生相同的字节(以及相应的值),这显然是行不通的 例如: SQL> select dump(to_binary_float(25185387)) from dual; DUMP(TO_BINARY_FLOAT(2518538 ------------------------

我有一个满是10位整数的表,我想通过将它们存储为二进制浮点数来加速Oracle中的查询/数学运算。这比数字对CPU更友好,不会占用太多空间(我认为),这意味着内存中会有更多数据

然而,二进制浮点数似乎会为两个不同的数字产生相同的字节(以及相应的值),这显然是行不通的

例如:

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、25185387*1.0、to_数字(25185387)等等

当我阅读文档时,二进制浮点数应该存储到1.79e308,所以它不会是一个舍入问题

我正在64位平台上使用Oracle 11.2.0.3


想法?谢谢。

因为oracle的实现是二进制浮点标准ieee 754。二进制浮点数与相同

单个有效位只有23位

25185387=1100000000100110001101011(长度=25)

25185388=1100000000100110001101101100(长度=25)

因此,这些oracle循环的重要性在于丢弃最低有效位

25185387~11000000001001100011011011*2^2

25185388~11000000001001100011011011*2^2


所以得到相同的值

有趣的…Oracle文档。。。假设一个二进制浮点数的“最大正有限值”为3.40282E+38F(我之前错放了)。所以我假设我可以储存一个这么大的号码。现在我明白你的意思了。那么,我能存储的最大整数是2^23吗?再次感谢您的精彩回答。2^23不失精准。四舍五入是随着时间的增加而发生的。意义位保存在。Oracle还以8位(指数符号+7位)存储数字的
指数
分量。最大数量=2^(2^7)*1.111..111≈ 3.4 * 10^38