Obliczenia dużej precyzji w Pythonie

In [1]:
from mpmath import *
mp.prec=24
cyfry = 10

mp.prec to liczba określająca dokładność (jako liczba cyfr dwójkowych). Precyzję, jako liczbę cyfr dziesietnych definiuje funkcja mp.dps.

Typ float języka C to 24 ctfry dwójkowe, czyjli jakieś 7.2 cyfry dziesiętnej Typ double języka C to 53 cyfry dqójkowe, czyli jakieś 15.8 cyfr dziesiętnych O wewnętrznej reprezentacji liczb zmiennoprzecinkowych mozna poczytać tu.

cyfry to liczba cyfr na wydruku kolejnych wartości.

Funkcja mpf() pozwala nadać zmiennej zadaną wartość o wielokrotnej precyzji. Lepiej wartości zapisywać jako napisy (używając pojedynczych cudzysłowów). W przeciwnym razie może być dokonywana kilkukrotna konwersja. Należy zadbać również, żeby w obliczeniach wielokrotnej precyzji wszystkie wartości były odpowiedniego typu.

In [2]:
0.1-mpf('0.1')
Out[2]:
mpf('-1.49011614e-9')
In [3]:
s = mpf('0.5')
a = mpf('3.7')

Poniższa pętla wylicza wartośc według wzoru: $s_{n+1} = (s_n * 0.5) * (1 - s_n)$ i drukuje co dziesiątą wartość.

In [4]:
for i in range(1, 201):
  s = (s * a) * (mpf('1') - s)
  if i % 10 == 0:
    print(''.join([str(temp_value) for temp_value in [i, ': ', nstr(s, cyfry)]]))
10: 0.7133773565
20: 0.264937669
30: 0.7071320415
40: 0.759770155
50: 0.8964278698
60: 0.5421027541
70: 0.2871110439
80: 0.2855977714
90: 0.2634914219
100: 0.7914719582
110: 0.863964498
120: 0.8007474542
130: 0.6594788432
140: 0.8937106133
150: 0.5421888828
160: 0.2846142352
170: 0.3180740178
180: 0.7556521893
190: 0.7059772611
200: 0.8025476336