只是好奇!但是我发现该π的由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类似物。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top