Переполнение Integer

ЧАстые Вопросы и Ответы

Модераторы: kdv, CyberMax

Vetal
Сообщения: 45
Зарегистрирован: 31 июл 2006, 12:58

Переполнение Integer

Сообщение Vetal » 08 авг 2006, 11:56

Здравствуйте! Если не трудно помогите разобраться в след. ситуации:
У меня есть поле в БД типа Integer в которых храняться байты трафика инетовского... При Select за большой промежуток времени по всем клиентам я получаю результат :-) с отрицательным числом... Происходит как я понимаю переполнение мак. значения типа Integer.
как мне перехватить это событие, чтобы потом перевести эти байты в мегобайты.... гигобайты при select. Сразу хранить их в гигобайтах не получиться т.к. будет необъективная картина трафика....
Заранее спасибо...
если че непонятно написал я уточню...

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 08 авг 2006, 12:07

При Select за большой промежуток времени по всем клиентам
Это, я так понимаю, сумма. Значит, суммируй уже в мегабайтах. типа select sum(field_bytes / 1024 / 1024) from table

Vetal
Сообщения: 45
Зарегистрирован: 31 июл 2006, 12:58

Переполнение Integer

Сообщение Vetal » 08 авг 2006, 12:13

А можно ли исходя из того какое число я получаю переводить или в мегобайты или в килобайты или в гигобайты?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 08 авг 2006, 12:46

Да просто кастуй их перед суммированием в целое побольше. Оно-то, надеюсь, не переполнится: sum(cast(field as bigint))

Vetal
Сообщения: 45
Зарегистрирован: 31 июл 2006, 12:58

Переполнение Integer

Сообщение Vetal » 08 авг 2006, 12:50

Если можно поподробнее как это работает?

Vetal
Сообщения: 45
Зарегистрирован: 31 июл 2006, 12:58

Переполнение Integer

Сообщение Vetal » 08 авг 2006, 12:54

Забыл сказать InterBase5. Там есть тип bigint?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 08 авг 2006, 13:05

Нет, там нет BigInt.
У тебя именно 5? Тогда переводи на 5.6, и чем раньше тем лучше!

Переводи в numeric, туда точно влезет.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 08 авг 2006, 13:17

WildSery писал(а):Переводи в numeric, туда точно влезет.
Ну-ну. Numeric/Decimal с цифрами от 10 - это Double Precision в IB 5. Хочешь, чтобы у него в отчете трафик был с дробным числом байтов? :lol:
Самый простой вариант - переход на FB (юзать Int64). Либо суммировать в ХП (с проверкой переполнения). Но опять-таки, предел в 2 гига учитываемого трафика - это плохо.

Vetal
Сообщения: 45
Зарегистрирован: 31 июл 2006, 12:58

Переполнение Integer

Сообщение Vetal » 08 авг 2006, 13:24

Либо суммировать в ХП (с проверкой переполнения).



Это как и что такое ХП? Возможности перейти на др. InterBase пока не представляеться возможным.... Понимаете ведь я могу попасть в переполнение в принципе при любом типе данных все зависит от количества хранимых в поле записей и том диапазоне Selecta котор. я делаю, как "перехватить " переполнение и исходя из этого делать какие либо операции типа перевести в гигобайты, теробайты и т.д.
Может так будет правильней?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 08 авг 2006, 13:31

CyberMax писал(а): Ну-ну. Numeric/Decimal с цифрами от 10 - это Double Precision в IB 5. Хочешь, чтобы у него в отчете трафик был с дробным числом байтов?
От большая проблема их срезать на клиенте при форматировании :)

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 08 авг 2006, 13:37

ХП - хранимая процедура (Stored Procedure). Это тебе наводка для поиска.
Можешь сделать трафик в виде строки и уже на клиенте переводить его в Int64 (Delphi). Недостаток - очевиден.
P.S. В этой теме - никаких вопросов про хп. Сразу срежу.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 08 авг 2006, 14:26

Merlin писал(а):От большая проблема их срезать на клиенте при форматировании :)
Это даже проблемой назвать нельзя :)... Но в результате получаешь погрешность в несколько байт. Баланс в итоге не сойдется.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 08 авг 2006, 14:50

Можно подумать ему этот байтовый баланс в налоговую сдавать... Расхождение пойдет только когда у double precision станет нехватать значащих цифр на все число а их 15 штук как минимум ЕМНИП.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 08 авг 2006, 15:00

CyberMax писал(а):Но в результате получаешь погрешность в несколько байт. Баланс в итоге не сойдется.
Ему как раз это и нужно. На больших значениях он собирается в Мега(Гига)байтах всё выдавать, так что ошибка на пару килобайт не видна невооружённым глазом. А на небольших значениях всё будет точно как в аптеке, надо только округлять правильно.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 08 авг 2006, 15:17

Dimitry Sibiryakov писал(а):Расхождение пойдет только когда у double precision станет нехватать значащих цифр на все число а их 15 штук как минимум ЕМНИП.
Уточнение:
1. Их не минимум 15, а максимум 15.
2. 1 + 1 не всегда равно 2. Это может быть как 1.999...9, так и 2.000...1. Тем более при постоянном суммировании погрешность может оказаться слишком значительной.

А вообще дело хозяйское. Если мелочь вроде байтов не нужна, тогда юзай Double Precision на здоровье.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 08 авг 2006, 15:20

CyberMax писал(а):2. 1 + 1 не всегда равно 2. Это может быть как 1.999...9, так и 2.000...1. Тем более при постоянном суммировании погрешность может оказаться слишком значительной.
Вот это уж ты загнул. Откуда там значительная погрешность возьмётся? Когда мы сложим триллион значений таких разве что, но тут уже целые части теряться будут, куда там до дробей 10^-15...

У нас в базе количество товара в строке хранится именно в numeric. И ничего, при любом суммировании всяких реализаций за весь период ни на копейку не уезжает :wink:

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 08 авг 2006, 15:38

Насчет значительной погрешности - согласен, перегнул.
WildSery писал(а):У нас в базе количество товара в строке хранится именно в numeric. И ничего, при любом суммировании всяких реализаций за весь период ни на копейку не уезжает :wink:
Извини за грубость, но ты х##ню сморозил. Стыдно не знать базовые вещи о типах. Numeric/Decimal фактически хранится в виде SmallInt/Integer/BigInt в зависимости от точности и масштаба числа. Поэтому дробные части и не слетают, потому что фактически их нет.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 08 авг 2006, 15:40

CyberMax писал(а): 2. 1 + 1 не всегда равно 2. Это может быть как 1.999...9, так и 2.000...1.
1+1 всегда = 2. Это на дробных значениях идет расхождение. 0.1+0.1 уже действительно не 0.2
Или это я опять брежу DEC-овскими внутренними представлениями?..

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 08 авг 2006, 15:47

2 Dimitry Sibiryakov. Цитирую Х. Борри:
"Даже значения с подходящей точностью числа с плавающей запятой могут не всегда храниться в точном представлении. Такие значения, как 1.93 или даже 123, могут быть представлены в памяти как значения, очень близкие к указанному числу.". "Эффект такой: когда вы выполняете какое-либо вычисление, которое должно дать результат 123, оно может быть очень близким приближением к 123.".
Собственно, тут все сказано.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 08 авг 2006, 16:03

При всем моем уважении к Хелен, я почти уверен что она не вдавалась глубоко в особенности хранения и обработки вещественных чисел, а просто в свое время убедилась что "вещественные числа неточны" и с тех пор говорит об этом всем остальным. В то время как могут быть нюансы... Например "неточны представления чисел с экспонентой отличной от нуля".

Ответить