2015-10-01 7 views
1

mpmath претендует на поддержку «арифметики с произвольной точностью с плавающей запятой».Я столкнулся с предел точности mpmath с плавающей запятой?

И все же. , ,

>>> import mpmath 
>>> 1 + mpmath.erf(-5.921) 
mpf('1.1102230246251565e-16') 
>>> 1 + mpmath.erf(-5.922) # I expect a smaller positive number here. 
mpf('0.0') 

Я что-то не хватает? Или это фундаментальное ограничение mpmath?

@jonrsharpe предположил, что проблема в том, что я отправил float в erf. Тем не менее, приведенный ниже код показывает, что это не проблема:

>>> 1 + mpmath.erf(mpmath.mpf('-5.922')) 
mpf('0.0') 
+2

Арифметика 'mpmath' может быть произвольно-точной, но * вы передаете ей' float', что не является *. – jonrsharpe

+0

* «Невозможно представить какой-либо интерес в' mpmath', если он не является 'float' * * - да, есть, см. Http://mpmath.googlecode.com/svn-history/r1229/trunk/doc /build/basics.html?highlight=float#number-types и попробуйте 'mpf ('- 5.922')'. Вам также может потребоваться настроить точность. – jonrsharpe

+0

Нет, я не вижу много смысла совершать кругосветное путешествие через 'str' - дело в том, что как только вы начнете использовать' float', трудно гарантировать возврат к произвольной точности. Вы должны использовать объекты 'mpf' как можно раньше. – jonrsharpe

ответ

1

Вопрос в данном случае имеет отношение к mpmath «s global precision setting слишком низко. Значение по умолчанию для prec является

>>> mpmath.mp.prec 
53 

Когда я установил его 100, я получаю результат я ожидал:

>>> 1 + mpmath.erf(-5.922) 
mpf('5.5236667058718205581661131647751e-17') 

В этом случае разница в скорости не заметно, но отмечают, что увеличение точность обычно увеличивает время, необходимое для вычисления результата.

+1

Обратите внимание, что точка @ jonrsharpe о поплавках против строк сохраняется. Сравните '1 + mpmath.erf (mpmath.mpf (0.001))' с '1 + mpmath.erf (mpmath.mpf (" 0.001 "))' после установки 'mpmath.mp.dps = 100'. – DSM

+0

Вы также видите эффект отмены. Поскольку '1' и' erf (-5.922) 'очень близки по абсолютной величине, вы теряете более 50 бит точности при добавлении. Правильный результат до 100 бит точности - «5.5236667058717915711865772335092e-17'. Ваш результат будет правильным только для первых 13 цифр или около того. – casevh

+0

@casevh Вправо. Лучше всего использовать 'mpmath.erfc (-x)'. – dbliss