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

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

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

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

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

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

2 ответа

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

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

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


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

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

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

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

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

Другие вопросы по тегам