целые числа или числа с плавающей запятой в ситуациях, когда кто-то будет делать

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

0

Решение

Некоторые причины предпочитают с плавающей точкой:

  • При умножении в формате с фиксированной запятой у продукта появляется новая шкала, поэтому ее необходимо скорректировать или написать код для учета измененной шкалы. Например, если вы принимаете формат, масштабированный до 100, так что .3 представлен с 30, а .4 представлен с 40, то умножение 30 на 40 дает 1200, но правильный ответ в том же масштабе должен быть 12 (представляя .12 ). Отдел нуждается в аналогичной корректировке.
  • Когда переполняется целочисленный формат, многие машины и языки программирования не имеют хорошей поддержки для получения наиболее значимой части результата. Плавающая точка автоматически производит наиболее значительную часть результата и округляет отброшенные биты.
  • Целочисленная арифметика обычно усекает дроби, но с плавающей точкой их округляет (если не требуется иное).
  • Некоторые расчеты включают в себя большой диапазон чисел, включая оба числа, которые являются очень большими и очень маленькими. Формат с фиксированной запятой имеет небольшой диапазон, но формат с плавающей запятой имеет большой диапазон. Вы можете вручную отследить масштаб в формате с фиксированной запятой, но тогда вы просто реализуете свою собственную с плавающей запятой, используя целые числа.
  • Многие машины и / или языки программирования игнорируют целочисленное переполнение, но с плавающей точкой могут изящно обрабатывать их и / или предоставлять уведомления, когда они происходят.
  • Арифметика с плавающей точкой хорошо определена и в целом хорошо реализована; ошибки в нем были уменьшены (иногда болезненным опытом). Построение новой самостоятельной арифметики склонно к ошибкам.
  • Для некоторых функций сложно заранее предсказать масштаб результата, поэтому неудобно использовать формат с фиксированной запятой. Например, рассмотрим синус. Когда входной сигнал близок к кратному π, синус близок к нулю. Поскольку π иррационально (и трансцендентно), структура, в которой целые числа или числа с фиксированной точкой близки к кратным π, очень нерегулярна. Некоторые числа с фиксированной запятой не кратны π, а их синусы около .1, .5, .9 и т. Д. Некоторые числа с фиксированной запятой очень близки к π, а их синусы близки к нулю. Некоторые из них очень близко к кратным π, и их синусы крошечные. Из-за этого не существует формата с фиксированной точкой с разумной точностью, который всегда может вернуть результат синуса без переполнения или переполнения.

Некоторые причины предпочитать целые числа:

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

Я рассмотрел способы перечислить некоторые «особенности» целочисленной арифметики в качестве причин для ее использования, но, при рассмотрении, они не являются реальными функциями:

  • Можно сказать, что целочисленная арифметика точна, пока не переполнится. Но это неверно, потому что целочисленная арифметика или арифметика с фиксированной точкой (целочисленная арифметика со шкалой) не является точной. Расчет ежемесячного процента с учетом годовой ставки обычно неточен. Конвертация между валютами не является точной. Физические расчеты не точны. Масштабирование координат не является точным.
  • В той степени, в которой целочисленная арифметика является точной до тех пор, пока она не переполнится, она не является функцией. Большинство машин допускают переполнение целочисленной арифметики без предупреждения. Таким образом, когда целочисленная арифметика терпит неудачу, она терпит неудачу эффектно. (С плавающей точкой IEEE 754 вы можете разработать точную арифметику и запросить ловушку или флаг, если возникнет неточность.)
2

Другие решения

Вот некоторые идеи, когда НЕ использовать float / doubles и придерживаться целых чисел / fixedpoint

  • Вам нужно сравнить на равенство
  • Вам нужны предсказуемые ошибки округления или нет ошибок округления. (как при обращении с деньгами)
  • Размер точности должен быть абсолютным, а не относительным к величине значения (иногда при обработке дат или пространственных координат. Временные интервалы или расстояния обычно используют поплавки)
-1

По вопросам рекламы [email protected]