관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] swift에서의 Float과 Double (부동 소수점, floating point) 본문

iOS 응용 (swift)

[iOS - swift] swift에서의 Float과 Double (부동 소수점, floating point)

jake-kim 2023. 1. 21. 22:16

Swift에서의 Float, Double

  • 학부 시절에 배웠던 부동 수소점으로 swift에서 Float과 Double 표현
    • Double은 Float보다 더욱 정밀하게 소수점을 표현
print(Double.pi) // 3.141592653589793
print(Float.pi) // 3.1415925
  • 만약 0.1을 백번 더한다면 10.0이 안나오므로 주의
var float: Float = 0.0
(0..<100).forEach { _ in float += 0.1 }
print(float) // 10.000002

var double = 0.0
(0..<100).forEach { _ in double += 0.1 }
print(double) // 9.99999999999998
  • 부동 소수점이란?
    • IEEE에서 표준으로 소수점의 근사값을 구하기 쉽게 비트로 정의한 수 표현 방식
    • 컴퓨터는 비트 단위로 표현해야 계산에 쉽기 때문에 비트로 표현
    • (아래는 float 형 부동 소수점 방식)

https://steemit.com/kr/@modolee/floating-point

  • 표준은 총 32bit를 사용하여 숫자를 표현
    • 첫번째 비트는 부호 비트 (0이면 양수, 1이면 음수)
    • 지수는 정수부분를 의미하며 8비트 사용
    • 가수는 소수부분을 의미하며 23비트 사용
  • "지수"와 "가수"의 의미?
    • 부동 소수점 방식은 아래와 같이 실수로 저장하며, 밑은 2를 가지는 형태
    • 가수는 1.2345 숫자이고, 지수는 말 그대로 exponential를 의미

https://m.blog.naver.com/kmc7468/220990920730

ex) 314.625를 부동 소수점으로 표현하면?

314.625의 가수부(소수) 구하기

1) 2진수로 표현

1 0011 1010.101(2)

2) 위에서 표현한 2진수의 숫자에 가장 왼쪽에 1만 남기고, 나머지 정수 부분을 소수부분으로 이동 (= 정규화 작업)

1 0011 1010.101(2) = 1.001 1101 0101(2)

3) 8개가 소수로 이동하였으니, 2^8만큼 이동했으므로 곱셈으로 표현

여기서 8은 `지수부`

1.001 1101 0101(2) = 1.001 1101 0101 * 2^8

4) 소수점의 오른쪽 부분 001 1101 0101을 부동 소수점에서의 가수부에 위치시키고 남은 12(=23-11)자리는 0으로 채워넣기

001 1101 0101 0000 0000 0000

314.625의 지수부 구하기

1) 3번에서 얻은 지수부 8을 사용하여, 지수 비트 부분을 표현

* 32bit에서의 지수 비트는 (2^8 - 1) + 지수부로 구성하기 때문에, 표현하면

127 + 8 = 135
즉, 지수비트 135 = 100000111(2)
  • 결과
    • 부호비트(1bit): 0 (양수)
    • 지수비트(8bit): 10000111 (127 + 8 = 135)
    • 가수 비트(23bit): 00000111010011001100110

* 참고

https://ko.wikipedia.org/wiki/%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90

https://codetorial.net/articles/floating_point.html

 

Comments