1

只是好奇!但我发现 SAS 持有的 π 值实际上是不正确的。

例如:

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

给出的 π 值为 (3.)141592653589792961327005696

但是 - π 当然是 (3.)1415926535897932384626433832795 ( http://www.joyofpi.com/pi.html ) - 到 31 dp。

是什么赋予了??!!

4

4 回答 4

6

PI 在所有编程语言中都保持为常数,并保持一定的精度。不是计算出来的。您的代码只是暴露了 PI 在 SAS 中的准确性。

于 2009-09-29T12:45:49.160 回答
6

SAS 将 PI 作为常数存储到小数点后 14 位。当您执行乘法步骤时,您看到的差异是浮点数学的伪影。

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

/*关于日志 */

pi=3.141592653589790000000000000000
于 2009-09-29T12:53:43.783 回答
3

你得到了 16 位的精度。这意味着它可能使用IEEE 754 双精度浮点表示,它只提供大约 16-17 个十进制数字的精度。π 不可能用任何有限位数表示,因此任何计算机表示都将在某些位数处被截断。有一些方法可以进行任意精度的数学运算(Java 有一个 BigDecimal 类),但即便如此,您也必须在某处截断 π。并且以这种方式完成的数学运算要慢几个数量级(因为它不是由直接 CPU 指令处理的)。

于 2009-09-29T12:53:00.570 回答
1

正如加里·舒特勒所说,它是一个常数。请注意,计算机语言的数值类型中的小分数值很少完全准确(事实上,它们的准确性可能低于它们的精度),因为它们被存储为可以快速操作的非常好的近似值。如果您需要出色的精度(如在金融和科学领域),您需要使用像 Java 这样的特殊类型BigDecimal来处理完全准确(以计算速度为代价)。(抱歉,不了解 SAS,所以不知道 . 的模拟BigDecimal。)

于 2009-09-29T12:54:54.640 回答