Pergunta

Existe uma opção no R para obter controle sobre a exibição do dígito. Por exemplo:

options(digits=10)

deve dar o cálculo resulta em 10 dígitos até o final da sessão R. No arquivo de ajuda de r, a definição para o parâmetro de dígitos é a seguinte:

Dígitos: controla o número de dígitos para imprimir ao imprimir valores numéricos. É apenas uma sugestão. Valores válidos são 1...22 com padrão 7

Então, diz que essa é apenas uma sugestão. E se eu gostar de exibir sempre 10 dígitos, não mais ou menos?

Minha segunda pergunta é: e se eu gostar de exibir mais de 22 dígitos, ou seja, para cálculos mais precisos como 100 dígitos? É possível com a base r, ou preciso de um pacote/função adicional para isso?

Editar: Graças à sugestão de Jmoy, tentei sprintf("%.100f",pi) e deu

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

que tem 48 decimais. Este é o limite máximo que r pode lidar?

Foi útil?

Solução

A razão pela qual é apenas uma sugestão é que você possa escrever facilmente uma função de impressão que ignorasse o valor das opções. As funções de impressão e formatação embutidas usam o options valor como padrão.

Quanto à segunda pergunta, como R usa aritmética de precisão finita, suas respostas não são precisas além de 15 ou 16 casas decimais; portanto, em geral, mais não são necessárias. o GMP e rcdd Os pacotes lidam com a aritmética de precisão múltipla (por meio de uma interação à biblioteca GMP), mas isso está relacionado principalmente a grandes números inteiros, em vez de lugares mais decimais para seus duplos.

Mathematica ou Bordo permitirá que você dê quantos lugares decimais desejarem seu coração.

EDITAR:
Pode ser útil pensar na diferença entre lugares decimais e números significativos. Se você está fazendo testes estatísticos que dependem de diferenças além do 15º número significativo, sua análise é quase certamente lixo.

Por outro lado, se você está apenas lidando com números muito pequenos, isso é menos um problema, pois R pode lidar com o número tão pequeno quanto .Machine$double.xmin (geralmente 2e-308).

Compare essas duas análises.

x1 <- rnorm(50, 1, 1e-15)
y1 <- rnorm(50, 1 + 1e-15, 1e-15)
t.test(x1, y1)  #Should throw an error

x2 <- rnorm(50, 0, 1e-15)
y2 <- rnorm(50, 1e-15, 1e-15)
t.test(x2, y2)  #ok

No primeiro caso, as diferenças entre os números ocorrem apenas após muitos números significativos, portanto os dados são "quase constantes". No segundo caso, embora o tamanho das diferenças entre os números seja o mesmo, em comparação com a magnitude dos próprios números, eles são grandes.


Conforme mencionado pelo E3BO, você pode usar números de ponto flutuante de múltiplos precisão usando o Rmpfr pacote.

mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825")

Estes são mais lentos e mais intensivos em memória do que o regular (dupla precisão) numeric vetores, mas podem ser úteis se você tiver um problema mal condicionado ou algoritmo instável.

Outras dicas

Se você estiver produzindo toda a saída, você pode usar sprintf(), por exemplo

> sprintf("%.10f",0.25)
[1] "0.2500000000"

especifica que você deseja formatar um número de ponto flutuante com dez pontos decimais (em %.10f a f é para flutuar e o .10 especifica dez pontos decimais).

Não conheço nenhuma maneira de forçar as funções de nível superior de R a imprimir um número exato de dígitos.

A exibição de 100 dígitos não faz sentido se você estiver imprimindo os números usuais de R, pois a melhor precisão que você pode obter usando duplas de 64 bits é de cerca de 16 dígitos decimais (veja .Machine $ Double.eps no seu sistema). Os dígitos restantes serão apenas lixo.

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