Функция ГРП теряет точность - PullRequest
0 голосов
/ 16 марта 2010

У меня есть переменная TDateTime, которой присваивается значение во время выполнения 40510.416667.Когда я извлекаю время в переменную типа TTime с помощью функции Frac, она устанавливает его на 0,41666666666.Почему он изменил точность значения, и есть ли рабочая среда для сохранения точности от исходного значения, т.е.установить его на 0,416667.

Ответы [ 4 ]

2 голосов
/ 16 марта 2010

Что должен знать каждый компьютерный ученый о числах с плавающей запятой должно помочь, также как и у собственной организации Точность с плавающей запятой - которая даст вам некоторую подробную информацию для ответа Джефа .

2 голосов
/ 16 марта 2010

TDateTime - число с плавающей запятой. Некоторые числа не могут быть представлены точно как число с плавающей запятой. 0.416667 / 0.41666666666 может показаться другим.

Вы можете округлить до 5 или 6 цифр для отображения. Это дает вам точность примерно до 1 секунды.

1 голос
/ 16 марта 2010

Спасибо за вашу помощь в этом, высоко ценится. Чтобы обойти мою проблему, возникающую из-за изменения точности, я использовал функцию CompareTime вместо операторов> = или <= для сравнения времени. </p>

1 голос
/ 16 марта 2010

Одной из причин потери точности является то, что TDateTime имеет тип double, а параметр и возвращаемое значение Frac имеют тип Extended.

При преобразовании чисел с плавающей запятой из одного типа в другой, некоторая точность может быть потеряна. (То же самое относится и к арифметике).

Для правильного сравнения значения с плавающей запятой, вы должны использовать функцию CompareValue из модуля Math.

...