Pergunta

apenas curioso! mas eu vi que o valor de p realizada pela SAS é de fato incorreto.

Por exemplo:

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

dá um valor p de (3.) 141592653589792961327005696

No entanto - p é, naturalmente, (3.) 1415926535897932384626433832795 ( http://www.joyofpi.com /pi.html ) - a 31 dp

.

que dá ?? !!

Foi útil?

Solução

SAS armazena PI como uma constante a 14 casas decimais. A diferença que você está vendo é um artefato de matemática de ponto flutuante quando você fez o passo de multiplicação.

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

/ * Log On * /

pi=3.141592653589790000000000000000

Outras dicas

PI é mantida como uma constante em todas as linguagens de programação com uma precisão set. Não é calculado. Seu código apenas expõe como PI precisa está em SAS.

Você tem 16 dígitos de precisão. O que significa que provavelmente usa um IEEE 754 de precisão dupla de ponto flutuante representação, que só dá cerca de 16-17 dígitos decimais de precisão. É impossível para p para ser representado em qualquer número finito de dígitos, portanto, qualquer representação computador vai ser truncado em algum número de dígitos. Existem várias maneiras de fazer matemática de precisão arbitrária (Java tem uma classe BigDecimal), mas mesmo assim, você teria que truncar algum lugar p. E matemática feito dessa forma é várias ordens de magnitude mais lento (porque não é tratado por instruções da CPU diretos).

Como Garry Shutler disse, ele é mantido como uma constante. Note que que pequenos valores fracionários em tipos numéricos de linguagens de computador raramente são tudo o que precisa (na verdade, sua precisão pode ser inferior a sua precisão), porque eles são armazenados como muito boas aproximações que podem ser manipulados rapidamente. Se você precisar de uma excelente precisão (como nos esforços financeiros e científicos), você precisa usar tipos especiais como BigDecimal de Java que lidar com ser totalmente preciso (ao custo de velocidade computacional). (Desculpe, não sei SAS por isso não sei de um análogo para BigDecimal.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top