Controlando o número de dígitos decimais na saída impressa em r
-
21-09-2019 - |
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?
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.