2010-04-26 3 views
4

Je me demande comment les calculatrices fonctionnent avec précision. Par exemple, la valeur de sin(M_PI) n'est pas exactement zéro lorsque calculé double précision:Comment les calculatrices fonctionnent-elles avec précision?

#include <math.h> 
#include <stdio.h> 

int main() { 
    double x = sin(M_PI); 
    printf("%.20f\n", x); // 0.00000000000000012246 
    return 0; 
} 

Maintenant, je voudrais certainement imprimer zéro lorsque l'utilisateur entre dans le péché (π). Je peux facilement tourner quelque part sur 1e-15 pour faire fonctionner ce cas particulier, mais c'est un hack, pas une solution. Quand je commence à tourner comme ça et que l'utilisateur entre quelque chose comme 1e-20, ils obtiennent un zéro retour (à cause de l'arrondi). La même chose se produit lorsque l'utilisateur entre 1/10 et frappe la touche = à plusieurs reprises - quand il atteint le seuil d'arrondi, il obtient zéro.

Et pourtant, certaines calculatrices retournent zéro pour sin (π) et en même temps, ils peuvent travailler avec des expressions telles que (1e-20)/10 confortablement. Où est l'astuce?

+0

De quelles calculatrices parlez-vous? –

+0

Par exemple, la calculatrice fournie avec les iPods et les iPhones. – zoul

Répondre

3

Les calculatrices de bureau utilisent des bibliothèques mathématiques de précision arbitraire. Ceux-ci peuvent être configurés pour avoir une précision beaucoup plus grande que le double. Calculatrices de poche (tradition dédié et téléphones mobiles) utilisent des bibliothèques mathématiques de précision fixe.

Si vous voulez imprimer exactement zéro, utilisez spécificateur largeur

printf (%12.4d, number); 
+0

Dépend de la calculatrice. Par exemple, Mathematica calcule avec une précision arbitraire (comme indiqué dans sa documentation, par exemple le tutoriel Numeric Precision). Je suis sûr qu'il existe d'autres calculatrices qui font la même chose, ainsi que certaines qui utilisent des bibliothèques de haute précision (mais pas de précision arbitraire) et peut-être certaines qui font juste des calculs en virgule flottante. –

+0

@Mark: Eh bien, la question se pose à propos des calculatrices de logiciels, et Mathematica est juste une généralisation du même concept. Peu importe comment vous définissez "calculatrice", cependant, il est probable que les différents utilisent des précisions différentes. –

+0

@High Performance Mark: La calculatrice par défaut sur ubuntu utilise une bibliothèque mathématique de précision arbitraire, j'ai donc choisi de généraliser l'idée. –

1

Ils peuvent utiliser une table de recherche pour accélérer leurs formules trig. Dans ce cas, les numéros spéciaux qui fonctionnent bien seraient probablement juste dans la table.

2

Certaines réponses se trouvent sur cette page Calculator Precision.

Parmi les solutions sont:

  • travail BCD
  • utilisation des tables de consultation
  • utiliser des chiffres cachés, de sorte que les chiffres affichés sont exacts
+0

BCD n'est pas vraiment plus précis que binaire; l'avantage est qu'il imite les calculs crayon-et-papier, et donc vous obtenez exactement la même précision ou inexactitude. –

+0

Avec binaire, il y a une source d'erreur de plus que BCD: c'est la conversion du résultat de base-2 en base-10. – mouviciel

+0

La précision relative indiquée par un nombre décimal affiché par exemple. six chiffres significatifs peuvent varier d'environ une partie par million (si la mantisse est de 9,99999) à dix parties par million (si elle est de 1 000 000), soit une variation de près de dix fois. La précision relative des nombres flottants binaires varie seulement d'un facteur deux. Ainsi, pour que la représentation binaire soit aussi précise que la décimale dans tous les cas, elle doit être dix (si pas vingt) aussi précise dans certains cas. Utiliser BCD n'aide pas vraiment, cependant; pour assurer un certain niveau de précision relative dans tous les calculs intermédiaires ... – supercat

1

L'astuce est probablement, comme déjà dit , que les calculatrices utiliseront arbitrary precision bibliothèques mathématiques ou lookup tables.

Je voudrais aussi ajouter que l'extrait de code fonctionne de cette façon en raison de l'utilisation floating point Arithmétique, qui, comme vous le savez probablement n'est pas vrai mathématiques dans le sens qu'il est pas précis - 1.0 + 0.1 != 1.1 (il est en fait 1,1000000000000001) :)

Questions connexes