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

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

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

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

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

CyberMax писал(а):Извини за грубость, но ты х##ню сморозил. Стыдно не знать базовые вещи о типах. Numeric/Decimal фактически хранится в виде SmallInt/Integer/BigInt в зависимости от точности и масштаба числа. Поэтому дробные части и не слетают, потому что фактически их нет.
Х##й это можно назвать только в особых условиях, о которых ты про себя подумал и решил, что у меня те же. А у меня база диалекта 1 (на сервере FB 1.0.3) и поле объявлено как numeric(15,4). Допускаю, что я отстал от жизни и такое поле не хранится как double precision со всеми вытекающими, тогда поправьте меня.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

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

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

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

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

WildSery писал(а):
CyberMax писал(а):Извини за грубость, но ты х##ню сморозил. Стыдно не знать базовые вещи о типах. Numeric/Decimal фактически хранится в виде SmallInt/Integer/BigInt в зависимости от точности и масштаба числа. Поэтому дробные части и не слетают, потому что фактически их нет.
Х##й это можно назвать только в особых условиях, о которых ты про себя подумал и решил, что у меня те же. А у меня база диалекта 1 (на сервере FB 1.0.3) и поле объявлено как numeric(15,4). Допускаю, что я отстал от жизни и такое поле не хранится как double precision со всеми вытекающими, тогда поправьте меня.
double precision конечно

Andrew Sagulin
Сообщения: 53
Зарегистрирован: 11 мар 2005, 15:44

Сообщение Andrew Sagulin » 09 авг 2006, 08:34

Так, чтобы немножко прояснить ситуацию с вещественными числами...
Неточность вещественных чисел (а вернее их распространённого способа хранения в ЭВМ) в том, что конечные десятичные дроби в двоичном представлении обычно (за очень редким исключением) выглядят как бесконечные периодические дроби. А целые числа - они и в Африке целые числа и до определённой величины (когда ещё не переполняется разрядная сетка и не отбрасываются младшие значащие цифры) хранятся и обрабатываются без погрешности. Поэтому, как тут уже верно заметили, 1 + 1 всегда равно 2. И 0.25+0.25 тоже всегда равно 0.5 (потому что в двоичном представлении это конечные дроби: 0.01+0.01=0.1). А вот 0.1 в двоичном представлении выглядит как периодическая дробь 0.0(0011) и, естественно, будет обрезаться.

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

Сообщение CyberMax » 10 авг 2006, 12:35

2 WildSery. Прошу прощения за резкий тон. Как-то не пришло в голову, что ты юзаешь FB на первом диалекте :).

Насчет вещественных чисел - был не прав. Невнимательно прочитал мануал: информацию о Float подсознательно применил к Double Precision.

Ответить