Всегда ли числа с плавающей запятой, используемые без эпсилона, всегда являются запахом кода? - PullRequest
1 голос
/ 11 февраля 2011

Этот вопрос очень прост.Это связано, но определенно не является обманом:

Большинство непатентованных веб-серверов Tomcat уязвимы, кто виноват?

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

Используются ли числа с плавающей точкой без эпсилона всегда с запахом кода или с запахом спецификации?

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

Ответы [ 2 ]

5 голосов
/ 11 февраля 2011

Нет, они абсолютно , а не всегда пахнут кодом.

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

Это не значит, что они никогда не должны использоваться.Есть много ситуаций (может быть, даже большинство ситуаций), где это правильно.Стоит только сказать, что все жесткие и быстрые правила глупы , включая это.


К вашему уточненному вопросу: «должно ли число с плавающей запятой действительно использоваться только когда-либо?для научных расчетов, а все остальное должно быть сделано с использованием фиксированного числа битов точности? "

Конечно, нет.Это было бы чудовищным инженерным бременем и крайне неэффективным.Неопытному программисту так же просто стрелять себе в ногу с помощью целочисленной арифметики (переполнения, деление-усечение, доступ к массиву за пределами границ и т. Д., И т. Д.), Как и с плавающей запятой.Плавающая точка - огромное удобство для подавляющего большинства программистов;если бы это было не так, его бы не использовали.

Как и во всех других вещах, найдите время, чтобы узнать о своих инструментах и ​​использовать правильный инструмент для работы.

1 голос
/ 11 февраля 2011

иногда нет необходимости в точности. Игровые движки используют плавающие точки для рендеринга все время. Аналогично, вы не будете делать денежные вычисления с помощью чисел с плавающей запятой, но это не проблема при написании графической системы с помощью чисел с плавающей запятой.

Проблема возникает, когда вы объединяете два разных набора данных (один неточный, другой точный (или более точный)). Например, разработчики игр часто используют ту же систему координат для своих мировых координат, что и для рендеринг, а затем, когда мир становится огромным, их плавающие с одинарной точностью начинают показывать большие ошибки округления. Допуск для полной координаты глобального местоположения не совпадает с допуском в системе координат 2D-локальная область-3D-экран-пространство.

...