Страница 1 из 1
то ли лыжи не едут, то ли я... хмммм
Добавлено: 13 май 2007, 00:59
Terran_off
В общем тема такая...
есть переменная типа real изначально равна 0 делаю
dis_ves := dis_ves + 0.01;
получаю переменную равную 0,010000...0002 (не считал сколько нулей)))
пытался сменить real на single и real48 лишняя часть изменилась но не исчезла(((
в чем глюк? помогите плиз... очень надо
Re: то ли лыжи не едут, то ли я... хмммм
Добавлено: 13 май 2007, 10:06
SergeyS
это из-за внутреннего представления действительных чисел, глюка нет, побороть никак. для действительный числе операция сравнения "=" практически не применима, необходимо использовать диапазоны сравнения
Re: то ли лыжи не едут, то ли я... хмммм
Добавлено: 13 май 2007, 13:39
Колядин Максим
Terran off писал(а):получаю переменную равную 0,010000...0002 (не считал сколько нулей)))
Это потому, что тип real имеет набор значений, которые являются подмножеством вещественных чисел, которые могут быть представлены в виде числа с плавающей точкой и с фиксированным количеством разрядов. Число с плавающей точкой обычно состоит из трех значений - М, B и E - так что М x B E = N, где B - всегда 2, а М и E - интегральные значения, находящиеся внутри диапазона вещественных чисел.
(
Материал из справки по Паскалю)
Re: то ли лыжи не едут, то ли я... хмммм
Добавлено: 13 май 2007, 13:44
Terran_off
SergeyS писал(а):это из-за внутреннего представления действительных чисел....
спасибо! С этим понятно, но самая засада в том, что надо эти числа хранить в Access`овской базе, и когда выводишь на отчет получается не очень красиво((((
может есть какой-нибуть хитрый способ корректного сохранения в базу или придется при печати рихтовать цифры?
Re: то ли лыжи не едут, то ли я... хмммм
Добавлено: 14 май 2007, 10:18
Хыиуду
Ну, в Аксессовской базе тоже есть тип данных real

Так что сохранится все ровно в том же самом виде. Только называется он там как-то по-другому, float вроде
Re: то ли лыжи не едут, то ли я... хмммм
Добавлено: 14 май 2007, 11:42
Игорь Акопян
Terran_off, при выводе использовать форматирование до нужной разрядности
Re: то ли лыжи не едут, то ли я... хмммм
Добавлено: 15 май 2007, 01:01
Naeel Maqsudov
А еще можно отказаться от типа Real и воспользоваться типом Currerncy (Этот тип есть и в Delphi и в Access). Это так называемое масштабированное целое. Ошибки округления нет.
Re: то ли лыжи не едут, то ли я... хмммм
Добавлено: 15 май 2007, 01:16
Naeel Maqsudov
Хыиуду писал(а):Ну, в Аксессовской базе тоже есть тип данных 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.