2009-09-29 7 views
1

juste curieux! mais j'ai remarqué que la valeur de π détenue par SAS est en fait incorrecte.Comment est-ce que π est calculé dans sas?

par exemple:

data _null_; 
x= constant('pi') * 1000000000000000000000000000; 
put x= 32.; 
run; 

donne une valeur de π de (3.) 141592653589792961327005696

cependant - π est bien sûr (3.) 1415926535897932384626433832795 (http://www.joyofpi.com/pi.html) - 31 dp.

qu'est-ce qui donne ?? !!

+0

En remarque, aucune application ne devrait nécessiter plus de 14 chiffres de précision sur Pi ... –

+1

@ static_rtti: * aucune * application? Aucune application d'ingénierie, éventuellement. –

Répondre

6

SAS stocke PI en tant que constante à 14 décimales. La différence que vous voyez est un artefact de calcul en virgule flottante lorsque vous avez fait l'étape de multiplication.

data _null_; 
    pi=constant("PI"); 
    put pi= 32.30; 
run; 

/* On Log */

pi=3.141592653589790000000000000000 
+0

Bonne réponse. En particulier le point sur les mathématiques en virgule flottante, en multipliant un petit nombre par un nombre relativement grand est un excellent moyen de rencontrer des problèmes. – Rog

6

PI est maintenu comme une constante dans tous les langages de programmation à une précision définie. Ce n'est pas calculé. Votre code ne fait qu'exposer la précision de PI dans SAS.

3

Vous avez 16 chiffres de précision. Ce qui signifie qu'il utilise probablement un IEEE 754 double-precision floating point representation, qui ne donne qu'environ 16-17 chiffres décimaux de précision. Il est impossible que π soit représenté dans un nombre fini de chiffres, donc toute représentation d'ordinateur va être tronquée à un certain nombre de chiffres. Il existe des moyens de faire des maths de précision arbitraire (Java a une classe BigDecimal), mais même alors, vous devrez tronquer π quelque part. Et les calculs effectués de cette manière sont plus lents (car ils ne sont pas gérés par les instructions directes du processeur).

1

Comme l'a dit Garry Shutler, il est tenu comme une constante. Notez que les petites valeurs fractionnaires dans les types numériques de langages informatiques sont rarement très précises (en fait, leur précision peut être inférieure à leur précision), car elles sont stockées comme de très bonnes approximations qui peuvent être manipulées rapidement. Si vous avez besoin d'une excellente précision (comme dans le domaine financier et scientifique), vous devez utiliser des types spéciaux comme le BigDecimal de Java qui gère la précision (au prix de la vitesse de calcul). (Désolé, ne sait pas SAS donc ne connais pas d'analogue pour BigDecimal.)

Questions connexes