то ли лыжи не едут, то ли я... хмммм

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Terran_off
Сообщения: 4
Зарегистрирован: 13 май 2007, 00:37

В общем тема такая...
есть переменная типа real изначально равна 0 делаю
dis_ves := dis_ves + 0.01;
получаю переменную равную 0,010000...0002 (не считал сколько нулей)))
пытался сменить real на single и real48 лишняя часть изменилась но не исчезла(((
в чем глюк? помогите плиз... очень надо
Аватара пользователя
SergeyS
Сообщения: 196
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

это из-за внутреннего представления действительных чисел, глюка нет, побороть никак. для действительный числе операция сравнения "=" практически не применима, необходимо использовать диапазоны сравнения
Аватара пользователя
Колядин Максим
Сообщения: 297
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

Terran off писал(а):получаю переменную равную 0,010000...0002 (не считал сколько нулей)))
Это потому, что тип real имеет набор значений, которые являются подмножеством вещественных чисел, которые могут быть представлены в виде числа с плавающей точкой и с фиксированным количеством разрядов. Число с плавающей точкой обычно состоит из трех значений - М, B и E - так что М x B E = N, где B - всегда 2, а М и E - интегральные значения, находящиеся внутри диапазона вещественных чисел.

(Материал из справки по Паскалю)
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...
Terran_off
Сообщения: 4
Зарегистрирован: 13 май 2007, 00:37

SergeyS писал(а):это из-за внутреннего представления действительных чисел....
спасибо! С этим понятно, но самая засада в том, что надо эти числа хранить в Access`овской базе, и когда выводишь на отчет получается не очень красиво((((
может есть какой-нибуть хитрый способ корректного сохранения в базу или придется при печати рихтовать цифры?
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Ну, в Аксессовской базе тоже есть тип данных real :) Так что сохранится все ровно в том же самом виде. Только называется он там как-то по-другому, float вроде
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

Terran_off, при выводе использовать форматирование до нужной разрядности
Изображение
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

А еще можно отказаться от типа Real и воспользоваться типом Currerncy (Этот тип есть и в Delphi и в Access). Это так называемое масштабированное целое. Ошибки округления нет.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Хыиуду писал(а):Ну, в Аксессовской базе тоже есть тип данных real :) Так что сохранится все ровно в том же самом виде. Только называется он там как-то по-другому, float вроде

Не совсем так.
Real (48бит) - это тип, изобретенный исключительно в Паскале для расширения разрядности стандартного (поддерживаемого процессором Intel) на тот момент типа Single (32бита).
Потом появились Double (64бита) и Extended (80бит).
Теперь в Delphi - Real по умолчанию является синонимом Double? А для совмесстимости отставлен тип Real48, а также введена директива компилятора {$REAL COMPATIBILITY ON}, при которой Real становится = Real48.
В Access есть только типы "Вещественное число" с размерами "Единичная точность" и "Двойная точность", что как нетрудно догадаться, соответствует Single и Double.

Если Real=Real48, то при записи значения в Access может (просто в связи с перекодированием в Double) возникнуть погрешность в 1*10^-38.
Ответить