Si j'avais eu besoin d'une précision à 20 chiffres (par exemple) après la virgule
Impossible avec des double sur 64 bit.
, et puisque l'imprécision générée par les calculs est de l'ordre de -4.44x10^-16
Non, "l'imprécision" (en fait l'erreur absolue) est de
1 ULP (Unit in the Last Place)
autour de la valeur considérée.
, donc de 15/16 chiffres après la virgule, quelle(s) solution(s) pourrai(en)t répondre à ce problème ?
Trois possibilités :
-) utiliser une bibliothèque externe proposant des nombres flotants sur 128 bits ou plus,
https://en.wikipedia.org/wiki/Quadruple ... int_format
https://en.wikipedia.org/wiki/Octuple-p ... int_format
-) utiliser une bibliothèque externe proposant de l'arithmétique à précision non bornée,
https://en.wikipedia.org/wiki/List_of_a ... c_software
-) utiliser l'UDF BigNum.au3
-) utiliser un logiciel externe (GP-Pari, Mathematica, Mapple, ...)
Par exemple, Mathematica permet autant le calcul symbolique exact que l'approximation à n'importe quelle précision souhaitée :
In[1]:= calcul = Sqrt[Pi^E + Log[3]]
Out[1]= Sqrt[\[Pi]^E + Log[3]] ; l'expression du calcul n'est pas exacte, donc reste sous cette forme symbolique
In[2]:= N[calcul, 274] ; je demande la valeur approchée à 274 décimales exactes
Out[2]= 4.853634721219671179059680005795474316737483903940018893683896454643264387449702074438021320558052759306807759006544812558178881370521664698251890173227870708686470396833566794828442177178733001091006658209482320661184938490988795382611674035658581988313533316602515259987996
In[3]:= N[calcul + 10^40, 313] ; la précision ne dépend pas de l'amplitude de la valeur
Out[3]= 1.0000000000000000000000000000000000000004853634721219671179059680005795474316737483903940018893683896454643264387449702074438021320558052759306807759006544812558178881370521664698251890173227870708686470396833566794828442177178733001091006658209482320661184938490988795382611674035658581988313533316602515259987996*10^40
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.