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


110

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

options(digits=10)

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

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

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

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

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

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

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


5
pi의 처음 15 자리 만 정확합니다. 진정한 가치와 비교 joyofpi.com/pi.html
Richie Cotton

1
네가 옳아. R에서는 왜 다른가요?
Mehper C. Palavuzlar


2
Mehper : R에서 숫자의 계산적 표현을 잘못 해석하고 있다고 생각합니다 . en.wikipedia.org/wiki/Floating_point 를 읽고 싶을 것 입니다.
Shane

비교하자면, 파이썬은 정확히 똑같습니다 : Try python -c "import math; print(format(math.pi, '.100f'))". 결과는 pi48 개의 "실제"소수이며 나머지 52 자리는 0으로 채워집니다.
syntaxerror

답변:


49

제안 일 뿐인 이유는 옵션 값을 무시하는 인쇄 함수를 아주 쉽게 작성할 수 있기 때문입니다. 내장 된 인쇄 및 서식 지정 기능은 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벡터 보다 더 느리고 메모리 집약적 이지만 조건이 좋지 않은 문제 나 불안정한 알고리즘이있는 경우 유용 할 수 있습니다.


4
으로 이 Rwiki 페이지를 보여줍니다의 Rmpfr 패키지는 R. 높은 정밀도 부동 소수점 연산이 가능
e3bo

그러나 Rmpfr을 R 패키지에서 정밀도를 향상시키기 위해 사용할 수 있습니까? 아니면 내부적으로 코딩 된 함수 만 사용할 수 있습니까?
skan

2
"유효한 15 위 이상의 차이에 의존하는 통계 테스트를 수행하는 경우 분석은 거의 확실하지 않습니다."라고 생각했습니다. 그러나 나는 그것이 쓰레기라고 결론 내릴 자릿수가 얼마인지 궁금했고 5라고 생각했지만 정정되어 기쁩니다.
PatrickT

46

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

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

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

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

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


실제로 제가 적용한 일부 특수 카이 제곱 테스트에는 정확한 결과를 제공하기 위해 수백 개의 소수가 필요했습니다. 또한 파이에는 수천 개의 소수가 있습니다. 그래서 100 자리 이상이 궁금합니다.
Mehper C. Palavuzlar

14
pi에는 무한한 소수의 소수가 있습니다. 그렇다고 컴퓨터가 저장할 수 있다는 의미는 아닙니다.
Shane

이것은 Mathematica가 R보다 우월한 시나리오라고 생각합니다.
skan

1
@skan Mathematica가 무한한 소수의 소수를 저장한다고 생각하십니까?
Gregor Thomas

@Gregor는 물론 아닙니다.하지만 기억이 허용하는 한 많은 숫자를 사용할 수 있습니다.
skan

1

필요에 따라 인쇄 할 소수 자릿수를 제어 할 수있는 또 하나의 솔루션 (중복 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각 시간 질의에 따라를 변경할 수 있으므로 다양한 십진 인쇄 요구 사항을 충족 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.