Oracle BINARY_FLOAT: 2 целых числа дают одинаковое значение? - PullRequest
3 голосов
/ 17 февраля 2012

У меня есть таблица, полная 10-значных целых чисел, и я думаю, что для ускорения запросов / математики в Oracle, сохраняя их как BINARY_FLOAT. Это более дружественно к процессору, чем NUMBER, и не займет много места (я думаю), что означает больше данных в памяти.

Однако, похоже, что BINARY_FLOAT возвращает одинаковые байты (и, следовательно, значение) для двух разных чисел ... что, очевидно, не будет работать.

Пример:

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_number (25185387) и т. Д.

Когда я читаю документы, BINARY_FLOAT следует хранить в 1.79e308, поэтому это не может быть проблемой с округлением.

Я использую Oracle 11.2.0.3 на 64-битной платформе.

Идеи? Спасибо.

1 Ответ

3 голосов
/ 17 февраля 2012

Поскольку реализация oracle соответствует стандарту BINARY_FLOAT ieee 754. BINARY_FLOAT аналогичен singe .

single имеет только 23 бита для значащих битов.

25185387 =11000000001001100011010 11 (длина = 25)

25185388 = 11000000001001100011011 00 (длина = 25)

отсюда важность этих оракулов, отбрасываниемладшие значащие биты

25185387 ~ 11000000001001100011011 * 2 ^ 2

25185388 ~ 11000000001001100011011 * 2 ^ 2

, поэтому получите то же значение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...