Frage

nur neugierig! aber ich entdeckte, dass der Wert von π von SAS gehalten ist in der Tat falsch.

zum Beispiel:

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

gibt einen π Wert von (3.) 141592653589792961327005696

jedoch - π ist natürlich (3.) 1415926535897932384626433832795 ( http://www.joyofpi.com /pi.html ) - bis 31 dp

.

Was gibt ?? !!

War es hilfreich?

Lösung

SAS speichert PI als Konstante auf 14 Dezimalstellen. Der Unterschied, den Sie sehen werden, ist ein Artefakt der Punkt math floating, wenn Sie den Multiplikationsschritt getan hat.

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

/ * Auf Protokoll * /

pi=3.141592653589790000000000000000

Andere Tipps

PI wird als Konstante in allen Programmiersprachen auf eine Menge Präzision gehalten. Es wird nicht berechnet. Ihr Code nur macht, wie genau PI ist in SAS.

Sie haben 16 Ziffern der Präzision. Das heißt, es wahrscheinlich verwendet eine IEEE 754 mit doppelter Genauigkeit Gleitkommadarstellung , die nur gibt etwa 16 bis 17 Dezimalstellen Präzision. Es ist unmöglich, für π in jeder endlichen Anzahl von Ziffern dargestellt werden, so dass jede Computerdarstellung ist bei gewisser Anzahl von Ziffern abgeschnitten gehen werden. Es gibt Möglichkeiten, von beliebiger Genauigkeit Mathe tun (Java hat eine BigDecimal Klasse), aber selbst dann würden Sie haben π irgendwo gestutzt. Und Mathematik auf diese Weise getan ist um mehrere Größenordnungen langsamer (weil es nicht durch direkte CPU-Befehle gehandhabt wird).

Wie Garry Shutler sagte, es als konstant gehalten. Beachten Sie, dass, dass kleine Bruchwerte in den numerischen Typen von Computersprachen sind selten alles, was genau (in der Tat, ihre Genauigkeit niedriger als die Präzision sein kann), weil sie als sehr gute Annäherungen gespeichert sind, die schnell bearbeitet werden kann. Wenn Sie hervorragende Präzision benötigen (wie in finanziellen und wissenschaftlichen Bemühungen), benötigen Sie spezielle Typen wie Java BigDecimal zu verwenden, ist völlig korrekt (auf Kosten der Rechengeschwindigkeit) handhaben. (Sorry, nicht wissen, SAS, so weiß nicht, von einem analogen für BigDecimal.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top