Для float
экземпляров Python использует числа с плавающей запятой на машинном уровне с двойной точностью (double
в терминах C).Что именно это, зависит от платформы и компилятора, который создал Python.В наши дни это, скорее всего, 64-битное двоичное двоичное число с двойной точностью .53-битное значение и дает от 15 до 17 значащих десятичных цифр.
Если вы используете numpy
, вы можете использовать long double
число с плавающей запятой.Это имеет 64-битный sigificand, который дает приблизительно 18 десятичных цифр .
Decimal
значения имеют регулируемая точность .По умолчанию это 28 значащих цифр, но вы можете это изменить.Поэтому переход к десятичному типу, вероятно, будет хорошим выбором , если вы можете обойтись стандартными математическими операторами и ограниченным количеством математических функций, которые Decimal
поддерживает .Но это действительно означает изменение всего вашего кода.Это часть стандартной библиотеки, которая может быть плюсом.
В качестве альтернативы вы можете посмотреть библиотеку mpmath
.Это также позволяет вам установить произвольную точность (по умолчанию это 15 значащих цифр).Он поддерживает гораздо более сложную математику, чем Decimal
.Он реализует все функции от math
и cmath
и более.Но здесь вам также необходимо преобразовать всю программу, чтобы изменить float
на тип mpf
.По умолчанию mpmath работает с целыми числами внутри.Когда доступно, mpmath использует привязки Python к библиотеке gmp , что делает его намного быстрее, особенно с высокой точностью (> 100 цифр).
Заключение
Если вы хотитеДля большей точности вам придется преобразовать вашу программу в математический модуль произвольной точности.В зависимости от того, сколько math
функций вы используете, mpmath
выглядит лучше;он поддерживает все функции от math
и cmath
, а затем некоторые.
Как преобразовать
Полное автоматическое преобразование из float
в mpf
(или Decimal
) типовэто невозможно.Но вы можете получить большую часть пути туда.
Оба Decimal
и mpf
поддерживают стандартные математические операторы.Таким образом, вы не должны менять их.Вам нужно взглянуть на места, где вы создаете или ввод чисел с плавающей запятой, и на места, где вы используете функции из math
.
Сначала измените все экземплярыот float(
до Decimal(
или mpf(
.Это заботится о явно созданных числах.Во-вторых, ищите все литералы с плавающей точкой и заменяйте их одинаково.Для этого вы можете использовать функцию поиска и замены вашего редактора или написать небольшой скрипт на Python.Так что это в значительной степени можно автоматизировать.
Затем посмотрите на все функции, которые читают данные из источника (например, из файла или базы данных), и обновите их.Это, вероятно, придется делать вручную, если только они явно не используют float()
, и в этом случае они обрабатываются вышеуказанным методом.
Если вы в настоящее время используете модуль math
, вам придетсянайдите и замените эти функции их эквивалентами в выбранном модуле.В этом случае поисковая часть может быть легко автоматизирована.Если вы использовали import math
, вы можете легко найти «math.
», чтобы найти функции, которые необходимо заменить.В этом случае при использовании mpmath
вы можете просто заменить "math.
" на "mpmath.
", поскольку mpmath
реализует все функции из math
.Если вы использовали from math import x, y, z
, вам нужно искать x, y и z отдельно.Вы даже можете написать скрипт для перевода math
функций в их эквиваленты в Decimal
или mpf
.В зависимости от размера и сложности вашей кодовой базы, стоит ли это делать.