Поддерживает ли mpmath очень маленькие числа? (Python) - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь решить числовую математическую задачу, и для этого мне нужно python, чтобы обрабатывать очень маленькие числа. Для этого я установил mpmath.
Однако он работает не совсем так, как хотелось бы. Mpmath может обрабатывать 1e-300, но не 1e-400 (10 ^ -300, но не 10 ^ -400 соответственно)

В голове у меня

from mpmath import mp
from mpmath import mpf

mp.dps = 500 

Если я наберу

x = mpf(1e-300)
print(x)

Я получаю тысячу di git число, которое близко к 1e-300 (это то, что я хочу)

Однако, если я сейчас наберу

y = mpf(1e-400)
print(y)

Я получаю результат: 0.0, что мне не подходит.

Я попытался увеличить десятичную точность (например, mp.dps = 3000), но это не помогло, я все равно получил ноль во втором случае.

Есть ли способ обойти это, или mpmath просто не может обработать 1e-400?

1 Ответ

2 голосов
/ 28 мая 2020

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

  • Двойные числа имеют диапазон от 1e-300 до 1e + 300.
  • Предоставьте номер mpmath в виде строки, чтобы он преобразовал его, а не передавал число с плавающей запятой

Значение изменилось с:

y = mpmath(1e-400) # 1e-400 becomes 0 as a 
                   # float due to limited
                   # doubles accuracy

To:

y = mpmath('1e-400')

Тест

from mpmath import mp
from mpmath import mpf

mp.dps = 500 

y = mpf('1e-400')
for k in range(10):
  print(k*y)

Выход

1.0e-400
2.0e-400
3.0e-400
4.0e-400
5.0e-400
6.0e-400
7.0e-400
8.0e-400
9.0e-400
...