Нормы в Python для чисел с плавающей запятой и десятичных чисел (с фиксированной точкой)

Рекомендуется ли использовать собственную реализацию Python с плавающей запятой или ее decimal для случаи использования, где важна точность?

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

Я не уверен, что для обычных случаев использования глубокого обучения, для научных вычислений в целом (например, многие люди используют numpy или scikit-learn, которые, как я думаю, используют реализации с плавающей запятой), и для финансовых вычислений (например, торговых стратегий), каковы нормы находятся.

Кто-нибудь знает нормы для использования с плавающей запятой и десятичного числа в python для этих трех областей?

  1. Финансы (торговые стратегии)
  2. Глубокое обучение
  3. Научные вычисления

Спасибо

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


person bobo    schedule 25.06.2020    source источник
comment
decimal не является точным представлением. Плавающая точка отлично работает для орбитальных траекторий - ошибка измерения и неточный контроль будут гораздо более значительными, чем ошибка округления с плавающей запятой.   -  person user2357112 supports Monica    schedule 25.06.2020
comment
Повышение точности при решении проблемы гораздо менее полезно, чем интуитивно ожидают начинающие программисты. То же самое с переходом на десятичную систему.   -  person user2357112 supports Monica    schedule 25.06.2020
comment
спасибо @ user2357112supportsMonica, я ценю это - разговаривая с другом, я также слышал, что обычно числа с плавающей запятой используются для повышения производительности, и программист должен достаточно знать предметную область, чтобы понять, когда точность будет иметь значение, а когда нет, и разработать алгоритм вокруг этих случаев. это соответствует твоему пониманию?   -  person bobo    schedule 25.06.2020


Ответы (1)


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

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

Финансы

В области финансирования, в зависимости от использования, вы можете использовать десятичное или плавающее число. Плюс у разных банков разные требования. Как правило, если вы имеете дело с наличными деньгами или их эквивалентом, вы можете использовать десятичную дробь, поскольку известна дробная денежная единица. Например, для долларов дробная денежная единица равна 0,01. Таким образом, вы можете использовать decimal для его хранения, а в базе данных вы можете просто использовать число (20,2) (оракул) или подобные вещи для хранения вашего десятичного числа. Точности достаточно, поскольку у банков есть систематический способ минимизировать ошибки в первый же день, еще до появления компьютеров. Программистам нужно только правильно реализовать то, что написано в гайдлайне банка.

Для других вещей в области финансирования, таких как анализ и процентная ставка, достаточно использовать double. Здесь точность не важна, важна простота. Процессоры оптимизированы для вычисления чисел с плавающей запятой, поэтому для вычисления арифметики с плавающей запятой не требуются специальные методы. Поскольку арифметика в компьютерах — это огромная тема, использование оптимизированного и стабилизированного способа выполнения вычислений гораздо безопаснее, чем создание собственных методов для выполнения арифметики. Кроме того, один или два вычисления с плавающей запятой не будут иметь большого значения для точности. Например, банки обычно сохраняют значение в decimal, затем выполняют умножение с процентной ставкой float, а затем конвертируют обратно в decimal. Таким образом, ошибки не будут накапливаться. Учитывая, что нам нужны только две цифры справа от запятой, точности числа с плавающей запятой вполне достаточно для выполнения такого вычисления.

Я слышал, что в инвестиционных банках они используют double во всех своих системах, так как имеют дело с очень большими суммами наличных денег. Таким образом, в этих банках простота и производительность важнее точности.

Глубокое обучение

Глубокое обучение — это одна из областей, где не требуется высокая точность, но требуется высокая производительность. Нейронная сеть может иметь миллионы параметров, поэтому точность одного веса и смещения не повлияет на предсказание сети. Вместо этого нейронная сеть должна очень быстро выполнять вычисления, чтобы обучаться на заданном наборе данных и выдавать прогноз за разумный интервал времени. Кроме того, многие ускорители могут фактически ускорять определенный тип поплавка: с половинной точностью, например, fp16. Таким образом, чтобы уменьшить размер сети в памяти и ускорить процесс обучения и прогнозирования, многие нейронные сети обычно работают в гибридном режиме. Платформа нейронной сети и драйвер ускорителя могут решить, какие параметры могут быть вычислены в fp16 с минимальным риском переполнения и потери значимости, поскольку fp16 имеет довольно небольшой диапазон: от 10^-8 до 65504. Другие параметры по-прежнему вычисляются в fp32. В некоторых периферийных устройствах используемая память очень мала (например, K 210 и граничный TPU имеют только 8 МБ встроенной SRAM), поэтому нейронные сети должны использовать 8-битные числа с фиксированной точкой, чтобы соответствовать этим устройствам. Числа с фиксированной запятой подобны десятичным числам, поскольку они противоположны числам с плавающей запятой, поскольку они имеют фиксированные цифры после десятичной точки. Обычно они представляют себя в системе как int8 или unit8.

Научные вычисления

Тип double (т. е. 64-битное число с плавающей запятой) обычно удовлетворяет потребности ученого в научных вычислениях. Кроме того, IEEE 754 также определяет четырехкратную точность (128 бит) для облегчения научных вычислений. Процессоры Intel x86 также имеют 80-битный формат повышенной точности.

Однако для некоторых научных вычислений требуется арифметика с произвольной точностью. Например, чтобы вычислить число Пи и выполнить астрономическое моделирование, нужны высокоточные вычисления. Таким образом, им нужно что-то другое, что называется числом с плавающей запятой произвольной точности. Одной из самых известных библиотек, поддерживающих числа с плавающей запятой произвольной точности, является GNU Multiple Precision Arithmetic Library (GMP). Обычно они хранят число непосредственно в памяти и используют стеки для имитации вертикального метода вычисления конечного результата.

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

person whilrun    schedule 25.06.2020
comment
Можно еще раз подчеркнуть, что в финансовых сделках важно, чтобы все стороны контракта, настоящие и будущие, имели возможность получить один и тот же результат, используя документированную процедуру. Если это так, то не имеет большого значения, что находится внутри процедуры, но формулировки процедур могут быть проще в той или иной мере. - person Lutz Lehmann; 25.06.2020