수치 정밀도에 대해서

R-Programming

R의 수치연산에서 32-비트의 정수와 IEC 60559 스팩의 부동 소수점(배정밀도)의 산술연산을 사용한다. R이 설치된 모든 머신에서 공통적으로 적용된다.

유충현
2021-06-30

R의 수치정밀도

R의 수치연산에서 32-비트의 정수와 IEC 60559 스팩의 부동 소수점(배정밀도)의 산술연산을 사용한다. R이 설치된 모든 머신에서 공통적으로 적용된다.

.Machine

.Machine은 R이 설치된 머신에서의 수치 정밀도에 대한 정보를 제공해 준다.

Numerical Characteristics of the Machine

library(dplyr)

.Machine %>% 
  unlist %>% 
  prettyNum()
               double.eps            double.neg.eps 
           "2.220446e-16"            "1.110223e-16" 
              double.xmin               double.xmax 
          "2.225074e-308"           "1.797693e+308" 
              double.base             double.digits 
                      "2"                      "53" 
          double.rounding              double.guard 
                      "5"                       "0" 
        double.ulp.digits     double.neg.ulp.digits 
                    "-52"                     "-53" 
          double.exponent            double.min.exp 
                     "11"                   "-1022" 
           double.max.exp               integer.max 
                   "1024"              "2147483647" 
              sizeof.long           sizeof.longlong 
                      "8"                       "8" 
        sizeof.longdouble            sizeof.pointer 
                     "16"                       "8" 
           longdouble.eps        longdouble.neg.eps 
           "1.084202e-19"            "5.421011e-20" 
        longdouble.digits       longdouble.rounding 
                     "64"                       "5" 
         longdouble.guard     longdouble.ulp.digits 
                      "0"                     "-63" 
longdouble.neg.ulp.digits       longdouble.exponent 
                    "-64"                      "15" 
       longdouble.min.exp        longdouble.max.exp 
                 "-16382"                   "16384" 

정수

정수는 0과 음수 및 양수로 구성된다. 그러므로 32-비트로 표현할 수 있는 정수의 범위는 \(-2 ^ {31} \sim 2 ^ {31} - 1\)이다.

정수의 최대값은 “integer.max”로 표현된다.

# 정수 최대값
.Machine[["integer.max"]]
[1] 2147483647
# 정수 최대값의 수식
2 ^ 31 - 1
[1] 2147483647

정수의 최대값을 초과하는 2147483648는 실수인 “numeric”으로 형변환되어 처리된다.

2147483647L %>% 
  is()
[1] "integer"             "double"              "numeric"            
[4] "vector"              "data.frameRowLabels"
2147483648L %>% 
  is()
[1] "numeric" "vector" 

부동 소수점

부동 소수점의 최소값과 최대값의 범위는 각각 “double.xmin”와 “double.xmax”에 정의되어 있다.

# 부동 소수점 최소값
.Machine[["double.xmin"]]
[1] 2.225074e-308
# 부동 소수점 최대값
.Machine[["double.xmax"]]
[1] 1.797693e+308

R은 부동 소수점의 최소값과 최대값의 범위를 초과하는 값은 수학에서의 무한대와는 다르지만, 무한대인 Inf(Infinite)로 표현한다.

1.797693e+308
[1] 1.797693e+308
1.797693e+308 < Inf
[1] TRUE
1.797694e+308 < Inf
[1] FALSE
1.797694e+308
[1] Inf

Round-Off 에러

컴퓨터는 수치를 이진수로 표현한다. 그래서 10진수의 소수점 이하의 자리수가 이진수로 컴퓨터에서 유효자리수로 처리될때, Round-Off 에러가 발생한다.

\(\sqrt4\)는 2이지만, \(\sqrt5\)는 소수점으로 제한된 비트 안에 채우기 위해서 오차가 발생한다. 그래서 예제의 \(\sqrt5 ^ 2\)이 정확한 5로 인식되지 않는다.

sqrt(4)
[1] 2
sqrt(4) ^ 2
[1] 4
sqrt(4) ^ 2 == 4
[1] TRUE
4 - sqrt(4) ^ 2 
[1] 0
sqrt(5)
[1] 2.236068
sqrt(5) ^ 2 
[1] 5
sqrt(5) ^ 2 == 5
[1] FALSE
5 - sqrt(5) ^ 2 
[1] -8.881784e-16

R에서 컴퓨터로 정확하게 표현할 수 있는 부동 소수점은 “double.eps”에 정의되어 있다. 이것은 \((1 + \epsilon) \ne 1\)을 만족하는 가장 작은 양의 부동소수점 \(\epsilon\)을 의미한다.

.Machine[["double.eps"]]
[1] 2.220446e-16
.Machine[["double.eps"]] + 1 != 1
[1] TRUE
2.220446e-17 + 1 != 1
[1] FALSE

Citation

For attribution, please cite this work as

유충현 (2021, June 30). Dataholic: 수치 정밀도에 대해서. Retrieved from https://choonghyunryu.github.io/posts/2021-06-30-numeric_precision/

BibTeX citation

@misc{유충현2021수치,
  author = {유충현, },
  title = {Dataholic: 수치 정밀도에 대해서},
  url = {https://choonghyunryu.github.io/posts/2021-06-30-numeric_precision/},
  year = {2021}
}