Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

дробные числа в Interbase [IB5.x]


July ©   (2005-10-19 12:41:00) 

Господа, кто-нибудь знает, почему, если вставлять обычным insert
число 0,01
в поле типа float записывается 0.0099999998
в поле типа DOUBLE PRECISION - 0.009999999776482582
Числа большие 1, во float выглядят такими же, как задавалось в запросе, а в DOUBLE PRECISION - тоже "преобразованными" - например из 1.000001 получается 1.000000953674316 и т.п.
Это связано с погрешностью вычислений при работе с вещественными числами? Но ведь я ничего не заставляю его вычислять, просто сохраняю число.
Сразу оговорюсь - я знаю, что можно использовать тип Numeric и указать, сколько я хочу видеть знаков после запятой.
Гораздо больше меня интересует вопрос - ПОЧЕМУ Interbase так хранит дробные числа? Чисто теоретицки.. :)
И можно ли каким-то образом принудительно заставить его вписать в поле именно типа float число 0.0100000000, а не 0.0099999998?
(или соответственно в DOUBLE PRECISION - 0.010000000000000000)
Другие СУБД себя так же ведут?


Zacho   (2005-10-20 00:25:00) [1]

July   (19.10.05 16:25) [7]

Если тебе нужно хранит числа с фиксированнойзапятой, то, если есть возможность стоит перейти на более свежие версии IB/FB и на диалект 3. В диалекте 3 NUMERIC и DECIMAL  хранятся без погрешностей.


July   (2005-10-19 16:25:00) [2]

isasa> Хранение и отображение разные вещи
Это я понимаю

to Johnmen - спасибо за линк, почитаю
А пока в общем понятно, что насильно хранить 0,0100000000000 комп не заставишь, придется выкручиваться с отображением,
в частности для IB - с numeric

Спасибо за подсказки.


isasa   (2005-10-19 15:19:00) [3]

Да что такое :)
0,1 = 0,05..0,14  +-0,05
0,10 = 0,095..0,104  +-0,005
...


isasa   (2005-10-19 15:17:00) [4]

Сорри, надо
0,1 = 0,095..0,14
0,10 = 0,995..0,104
...


isasa   (2005-10-19 15:16:00) [5]

все упирается в способы представления дробных чисел в памяти или регистрах процессора

Вещественные числа всегда задаются(пишутся) с определенной точностью(количеством знаков)

0,1 = 0,094..0,14
0,10 = 0,994..0,104
...


Desdechado   (2005-10-19 13:51:00) [6]

все упирается в способы представления дробных чисел в памяти или регистрах процессора
для них точных НИКОГДА не будет


Johnmen   (2005-10-19 13:00:00) [7]

Весьма полезно
http://www.delphikingdom.com/asp/viewitem.asp?UrlItem=/helloworld/reals.htm


isasa   (2005-10-19 12:49:00) [8]

в поле типа float записывается 0.0099999998
в поле типа DOUBLE PRECISION - 0.009999999776482582

А не пробовал?
single(Delphi) -> float (IB)
double(Delphi) ->  DOUBLE PRECISION (IB)
:)))
Хранение и отображениеразные вещи


Наверх

Титульная страница Поиск, карта сайта Написать письмо