it-swarm.dev

R의 인쇄 출력에서 ​​소수 자릿수 제어

R에는 숫자 표시를 제어 할 수있는 옵션이 있습니다. 예를 들면 다음과 같습니다.

options(digits=10)

r 세션이 끝날 때까지 10 자리 숫자로 계산 결과를 제공해야합니다. R의 도움말 파일에서 자리수 매개 변수의 정의는 다음과 같습니다.

자릿수 : 숫자 값을 인쇄 할 때 인쇄 할 자릿수를 제어합니다. 단지 제안 일뿐입니다. 유효한 값은 1 ... 22이며 기본값은 7

따라서 이것은 제안 일뿐입니다. 항상 10 자리를 표시하려면 어떻게합니까?

두 번째 질문은 22 자리 이상, 즉 100 자리와 같은보다 정확한 계산을 표시하려면 어떻게해야합니까? 기본 R로 가능합니까, 아니면 추가 패키지/기능이 필요합니까?

Edit : jmoy의 제안 덕분에 sprintf("%.100f",pi)을 시도해 보았습니다.

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

소수점 이하 48 자리입니다. 이것이 R이 처리 할 수있는 최대 한계입니까?

100

그것이 제안 일뿐 인 이유는 옵션 값을 무시한 인쇄 기능을 쉽게 작성할 수 있기 때문입니다. 내장 인쇄 및 포맷 기능은 기본값으로 options 값을 사용합니다.

두 번째 질문에 관해서는, R은 유한 정밀도 산술을 사용하기 때문에 귀하의 답변은 소수점 이하 15 자리 또는 16 자리를 넘지 않으므로 일반적으로 더 많은 것이 필요하지 않습니다. gmprcdd 패키지는 다중 정밀도 산술을 처리하지만 (gmp 라이브러리와의 인터페이스를 통해), 이것은 대부분 double의 소수점 이하 자리가 아니라 큰 정수와 관련이 있습니다. .

Mathematica 또는 Maple 을 사용하면 마음이 원하는만큼 소수점 이하 자릿수를 줄 수 있습니다.

편집하다:
소수점과 유효 숫자의 차이에 대해 생각하면 도움이 될 수 있습니다. 15 번째 중요한 수치 이상의 차이에 의존하는 통계 테스트를 수행하는 경우 분석은 거의 정크입니다.

반면에 아주 작은 숫자 만 처리한다면 R은 .Machine$double.xmin (보통 2e-308)만큼 작은 숫자를 처리 할 수 ​​있기 때문에 문제가되지 않습니다.

이 두 분석을 비교하십시오.

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

첫 번째 경우, 숫자 사이의 차이는 많은 중요한 수치 후에 만 ​​발생하므로 데이터는 "거의 일정하다". 두 번째 경우, 숫자 사이의 차이의 크기는 동일하지만 숫자 자체의 크기와 비교하면 크기가 큽니다.


E3bo에서 언급했듯이 Rmpfr 패키지를 사용하여 배정 밀도 부동 소수점 숫자를 사용할 수 있습니다.

mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825")

이들은 정규 (배정도) numeric 벡터보다 사용하기에 속도가 느리고 메모리를 많이 사용하지만 조건이 좋지 않거나 알고리즘이 불안정한 경우 유용 할 수 있습니다.

45
Richie Cotton

전체 출력을 직접 생성하는 경우 sprintf()을 사용할 수 있습니다 (예 :.

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

부동 소수점 숫자를 소수점 10 자리로 형식화하도록 지정합니다 (%.10f에서 f은 부동 소수점이고 .10는 소수점 10 자리를 지정 함).

R의 상위 수준 함수가 정확한 자릿수를 인쇄하도록 강제하는 방법을 모르겠습니다.

R의 일반적인 숫자를 인쇄하는 경우 100 자리를 표시하는 것은 의미가 없습니다. 64 비트 두 배를 사용할 수있는 최상의 정확도는 16 진수 정도입니다 (시스템의 .Machine $ double.eps 참조). 나머지 숫자는 정크입니다.

40