题
只是好奇!但是我发现该π的由SAS保持的值实际上是不正确。
例如:
data _null_;
x= constant('pi') * 1000000000000000000000000000;
put x= 32.;
run;
给出的π值(3.)141592653589792961327005696
然而 - π当然是(3)1415926535897932384626433832795( http://www.joyofpi.com /pi.html ) - 至31 DP
。什么赋予?? !!
解决方案
SAS存储PI作为常数至14位小数。您所看到的差异是浮点运算时做乘法步骤的伪影。
data _null_;
pi=constant("PI");
put pi= 32.30;
run;
/ *在登录* /
pi=3.141592653589790000000000000000
其他提示
PI被保持在所有的编程语言的一组精确的常数。它不计算。您的代码只是暴露出PI如何准确的是SAS。
您得到的精度16位。这意味着它可能使用的 IEEE 754双精度浮点表示,该只给出了精确约16-17个十进制数字。这是不可能的π以任何有限数量的位数来表示,因此任何计算机表示会在一些数量的数字被截断。这样做有任意精度数学(Java有一个BigDecimal类)的方式,但即使如此,你必须从某个地方截断π。和数学这样做的方式是几个数量级慢(因为它不是由直接的CPU指令处理)。
正如加里Shutler说,它保持为一个常数。需要注意的是,在数字类型的计算机语言的小分数值很少全部准确(事实上,它们的精确度可以比其精度较低),因为他们保存为可以快速操控非常好的近似。如果你需要出色的精度(如金融和科学工作),你需要使用特殊的类型,如Java的BigDecimal
该处理是完全正确的(在计算速度为代价)。 (对不起,不知道SAS所以不知道BigDecimal
类似物。)
不隶属于 StackOverflow