Потеря точности при работе с функцией POWER

Torque
Дата: 24.05.2012 17:41:21
Firebird 2.5.1:
SELECT
  16 * 16 * 16 * 16 * 16 * 16 * 16 * 16 * 16 * 16 * 16 * 16 * 16,
  POWER(16, 13),
  CAST(POWER(16, 13) AS BIGINT)
FROM
  RDB$Database

4503599627370496
4503599627370496,000
4503599627370497

Результат мне нужен целочисленный, поэтому в третьем варианте я привожу результат POWER к BIGINT (функция оперирует вещественными числами), - результат оказывается на 1 больше.

Подскажите как правильно использовать этот POWER, чтобы результат был верный?
Гаджимурадов Рустам
Дата: 24.05.2012 17:48:58
Ну делай Trunc.
WildSery
Дата: 24.05.2012 17:52:05
TRUNC не преобразует в целое, а только обрезает хвост, которого и так нет.
Проблема в преобразовании DOUBLE PRECISION в BIGINT.
select cast(cast(4503599627370496 as double precision) as bigint) from rdb$database

Результат будет 4503599627370497
Гаджимурадов Рустам
Дата: 24.05.2012 18:03:21
А, ну да, действительно.

Тогда через промежуточный cast.

P.S. Хотя по идее, это бага, в трекер.
Dimitry Sibiryakov
Дата: 24.05.2012 18:10:40

Ну какой, нафиг, баг? У double точность 15 знаков, а в примере выше их 16. Чудеса expected.

Posted via ActualForum NNTP Server 1.5

Гаджимурадов Рустам
Дата: 24.05.2012 18:23:51
Ну почему же чудеса, в разрядность-то влезает.
Dimitry Sibiryakov
Дата: 24.05.2012 18:29:21

Гаджимурадов Рустам
в разрядность-то влезает

Каким местом 16 цифр влезает в 15?

Posted via ActualForum NNTP Server 1.5

Гаджимурадов Рустам
Дата: 24.05.2012 18:33:52
Dimitry Sibiryakov
Каким местом 16 цифр влезает в 15?
Кто-то кроме тебя говорил о цифрах? Я сказал разрядностью, то бишь битностью.
Dimitry Sibiryakov
Дата: 24.05.2012 18:41:26

Гаджимурадов Рустам
Я сказал разрядностью, то бишь битностью.

Т.е. ты хочешь сказать: double - 64 бита и bigint тоже 64 бита, они должны влезать друг в
друга?.. Ню-ню... Вот только у double всего 52 бита заняты собственно числом...

Posted via ActualForum NNTP Server 1.5

S.G.
Дата: 24.05.2012 18:42:43
Гаджимурадов Рустам
Dimitry Sibiryakov
Каким местом 16 цифр влезает в 15?
Кто-то кроме тебя говорил о цифрах?

Language Reference говорит.
автор
DOUBLE PRECISION specifies a double-precision, 64-bit datatype with a precision of approximately 15 decimal digits.