Existe uma opção em R para obter controle sobre a exibição de dígitos. Por exemplo:
options(digits=10)
deve fornecer os resultados do cálculo em 10 dígitos até o final da sessão R. No arquivo de ajuda de R, a definição do parâmetro de dígitos é a seguinte:
dígitos: controla o número de dígitos a serem impressos ao imprimir valores numéricos. É apenas uma sugestão. Os valores válidos são 1 ... 22 com padrão 7
Portanto, diz que é apenas uma sugestão. E se eu gostar de sempre exibir 10 dígitos, nem mais nem 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?
Edit: Graças à sugestão de jmoy, eu tentei sprintf("%.100f",pi)
e deu
[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"
que tem 48 casas decimais. Este é o limite máximo que R pode suportar?
python -c "import math; print(format(math.pi, '.100f'))"
. O resultado sãopi
48 decimais "reais", preenchidos por zeros para os 52 dígitos restantes.Respostas:
A razão de ser apenas uma sugestão é que você poderia facilmente escrever uma função de impressão que ignorasse o valor das opções. As funções integradas de impressão e formatação 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, não são necessárias mais. Os pacotes gmp e rcdd lidam com aritmética de precisão múltipla (por meio de uma interação com a biblioteca gmp), mas isso está relacionado principalmente a números inteiros grandes em vez de mais casas decimais para seus duplos.
O Mathematica ou o Maple permitirão que você dê quantas casas decimais você desejar.
EDIT:
Pode ser útil pensar sobre a diferença entre casas decimais e algarismos significativos. Se você estiver fazendo testes estatísticos que dependem de diferenças além do 15º algarismo significativo, então sua análise é quase certamente um lixo.
Por outro lado, se você está lidando apenas com números muito pequenos, isso não é um problema, pois R pode lidar com números tão pequenos quanto
.Machine$double.xmin
(geralmente 2e-308).Compare essas duas análises.
No primeiro caso, as diferenças entre os números só ocorrem depois de muitos algarismos 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 precisão múltipla usando o
Rmpfr
pacote.Eles são mais lentos e usam mais memória do que os
numeric
vetores regulares (precisão dupla) , mas podem ser úteis se você tiver um problema mal condicionado ou algoritmo instável.fonte
Se você está produzindo toda a produção sozinho, pode usar
sprintf()
, por exemploEspecifica que você deseja formatar um número de ponto flutuante com pontos decimais dez (em
%.10f
of
é para bóia e as.10
especifica pontos decimais dez).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.
Exibir 100 dígitos não faz sentido se você estiver imprimindo os números usuais de R, já que a melhor precisão que você pode obter usando duplos de 64 bits é em torno de 16 dígitos decimais (veja .Machine $ double.eps em seu sistema). Os dígitos restantes serão apenas lixo.
fonte
Mais uma solução capaz de controlar quantos dígitos decimais imprimir com base nas necessidades (se você não quiser imprimir zero (s) redundante (s))
Por exemplo, se você tem um vetor como
elements
e gostaria de obtê-sum
loAparentemente, o último digital
1
foi truncado, o resultado ideal deve ser-876.54321
, mas se definido como opção decimal de impressão fixa, por exemplosprintf("%.10f", sum(elements))
, zero (s) redundante (s) gera como-876.5432100000
Seguindo o tutorial aqui: imprimindo números decimais , se conseguirmos identificar quantos dígitos decimais em um determinado número numérico, como aqui em
-876.54321
, há 5 dígitos decimais que precisam ser impressos, então podemos configurar um parâmetro paraformat
função conforme abaixo:Podemos alterar a
decimal_length
consulta com base em cada vez, para que possa atender a diferentes requisitos de impressão decimal.fonte