Есть ли способ установить точность по умолчанию, которая отличается от двойной в Python? - PullRequest
0 голосов
/ 26 января 2020

Я знаю о десятичной системе, однако я работаю с большим количеством кода, написанного кем-то другим, и я не хочу go через большой объем кода изменять каждую инициализацию числа с плавающей запятой на Десятичный. Было бы удобнее, если бы был какой-то пакет, где я мог бы поместить SetPrecision(128) или что-то подобное в начало моих сценариев и отправиться в гонку. Я подозреваю, что такой вещи не существует, но я решил спросить на всякий случай, если я ошибаюсь.

Чтобы избежать XY Комментарии к проблеме, я решаю дифференциальные уравнения, которые должны быть положительно инвариантными, и одну величину который имеет равновесие порядка 1e-12, становится отрицательным независимо от допустимой погрешности, которую я указываю (используя интерфейс scipy для LSODA).

Ответы [ 2 ]

0 голосов
/ 26 января 2020

LSODA, предоставляемый через scipy.integrate, имеет только двойную точность.

Возможно, вы захотите взглянуть на изменение масштаба переменных, чтобы вещь, равная 1e-12, стала ближе к единице.

РЕДАКТИРОВАТЬ. В комментариях вы указали

Как я уже говорил три раза, я открыт для переписывания, чтобы избежать LSODA

Тогда вы можете попытаться сделать это - посмотреть код solve_ivp, который является чистым python. Накормите его десятичными знаками или точными числами типа mpmath. Наблюдайте, где это терпит неудачу, ищите, где это предполагает двойную точность. Перепишите, удалите это предположение. Промыть и повторить. Будет ли это работать в конце концов, я не знаю. Стоит ли это того, я подозреваю, что нет, но YMMV.

0 голосов
/ 26 января 2020

да, но нет. `

Пакет bigfloat представляет собой оболочку Python для библиотеки GNU MPFR для надежной арифметики с плавающей точкой произвольной точности c. Библиотека MPFR - это хорошо известная переносимая библиотека C для арифметики произвольной точности c для чисел с плавающей точкой. Он обеспечивает точный контроль точности и режимов округления и дает правильно округленные воспроизводимые результаты, не зависящие от платформы.

Blockquote

https://pythonhosted.org/bigfloat

Затем вам нужно будет заставить встроенный float быть bigfloat везде, что, вероятно, будет нетривиальным.

...