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

R에는 숫자 표시를 제어하는 ​​옵션이 있습니다. 예를 들면 :

options(digits=10)

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

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

그래서 이것은 단지 제안이라고 말합니다. 더 많거나 적지 않은 항상 10 자리 숫자를 표시하려면 어떻게해야합니까?

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

편집 : jmoy의 제안 덕분에, 나는 노력 sprintf("%.100f",pi)과는 준

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

48 개의 소수가 있습니다. 이것이 R이 처리 할 수있는 최대 한계입니까?



답변

제안 일 뿐인 이유는 옵션 값을 무시하는 인쇄 함수를 아주 쉽게 작성할 수 있기 때문입니다. 내장 된 인쇄 및 서식 지정 기능은 options값을 기본값으로 사용합니다 .

두 번째 질문에 관해서는 R이 유한 정밀도 산술을 사용하기 때문에 답변이 소수점 이하 15 자리 또는 16 자리 이상으로 정확하지 않으므로 일반적으로 더 많은 것이 필요하지 않습니다. GMPRCDD 패키지 (GMP의 라이브러리에 interace를 통해) 여러 정밀 연산 처리, 그러나 이것은 대부분 오히려 두 배 더 많은 소수 자릿수보다 큰 정수 관련이있다.

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벡터 보다 더 느리고 메모리 집약적 이지만 조건이 좋지 않은 문제 나 불안정한 알고리즘이있는 경우 유용 할 수 있습니다.


답변

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

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

당신이 (에 열 소수점 포인트로 부동 소수점 숫자를 포맷 할 지정 %.10f(가) f플로트와입니다 .10지정 열 진수 점).

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

R의 일반적인 숫자를 인쇄하는 경우 100 자리를 표시하는 것은 의미가 없습니다. 64 비트 double을 사용하여 얻을 수있는 최상의 정확도는 십진수 16 자리 정도이기 때문입니다 (시스템의 .Machine $ double.eps 참조). 나머지 숫자는 쓰레기입니다.


답변

필요에 따라 인쇄 할 소수 자릿수를 제어 할 수있는 또 하나의 솔루션 (중복 0을 인쇄하지 않으려는 경우)

예를 들어, 벡터가 elements있고 sum그것을 얻고 싶다면

elements <- c(-1e-05, -2e-04, -3e-03, -4e-02, -5e-01, -6e+00, -7e+01, -8e+02)
sum(elements)
## -876.5432

분명히, 마지막 디지털 1이 잘 렸을 때 이상적인 결과는이어야 -876.54321하지만 고정 인쇄 소수점 옵션으로 설정하면 예를 들어 sprintf("%.10f", sum(elements))중복 제로가 다음과 같이 생성됩니다.-876.5432100000

여기 튜토리얼에 따라 : 10 진수 인쇄 , 여기에서와 같이 특정 숫자에서 소수 자릿수를 식별 할 수있는 경우 -876.54321인쇄해야하는 10 진수 5 자리가 있으면 format아래와 같이 함수에 대한 매개 변수를 설정할 수 있습니다.

decimal_length <- 5
formatC(sum(elements), format = "f", digits = decimal_length)
## -876.54321

decimal_length각 시간 질의에 따라를 변경할 수 있으므로 다양한 십진 인쇄 요구 사항을 충족 할 수 있습니다.


답변