λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

빈 ꡬ멍 μ±„μš°κΈ°

[Java] float 와 double 데이터 νƒ€μž…μ΄ 정확성을 보μž₯ν•  수 μ—†λŠ” 이유

좜처

ChatGPT


'float'와 'double' 데이터 νƒ€μž…μ€ 뢀동 μ†Œμˆ˜μ  수(floating-point numbers)둜, 컴퓨터 μ‹œμŠ€ν…œμ—μ„œ μ‹€μˆ˜λ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€. ν•˜μ§€λ§Œ 이듀은 정밀도(precision)의 ν•œκ³„ λ•Œλ¬Έμ— νŠΉμ •ν•œ λ²”μœ„λ‚˜ λΉ„νŠΈ 수λ₯Ό λ„˜μ–΄μ„œλ©΄ 정확성을 보μž₯ν•  수 μ—†λ‹€. 

 

뢀동 μ†Œμˆ˜μ  수의 ν‘œν˜„ 방식

뢀동 μ†Œμˆ˜μ  μˆ˜λŠ” IEEE 754 ν‘œμ€€μ— 따라 μ €μž₯되며, 이 방식은 숫자λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ λ‹€μŒκ³Ό 같은 μ„Έ 가지 ꡬ성 μš”μ†Œλ‘œ 이루어져 μžˆλ‹€.

'μ•„μ΄νŠΈλ¦¬ν”Œμ΄' 라고 μ½λŠ”λ‹€.

1. λΆ€ν˜Έ λΉ„νŠΈ Sign Bit

  • μˆ«μžκ°€ μ–‘μˆ˜μΈμ§€ μŒμˆ˜μΈμ§€λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
  • 1λΉ„νŠΈλ₯Ό μ‚¬μš©ν•œλ‹€.

2. μ§€μˆ˜λΆ€ Exponent

  • 숫자의 λ²”μœ„λ₯Ό κ²°μ •ν•˜λŠ” 데 μ‚¬μš©λœλ‹€. 숫자λ₯Ό 2의 κ±°λ“­μ œκ³±μœΌλ‘œ ν‘œν˜„ν•œλ‹€.
  • 'float' λŠ” 8λΉ„νŠΈλ₯Ό μ‚¬μš©ν•˜κ³ , 'double'은 11λΉ„νŠΈλ₯Ό μ‚¬μš©ν•œλ‹€.

3. κ°€μˆ˜λΆ€ Significand or Mantissa

  • 숫자의 정확성을 λ‚˜νƒ€λ‚Έλ‹€.
  • 'float'λŠ” 23λΉ„νŠΈλ₯Ό μ‚¬μš©ν•˜κ³ , 'double'은 52λΉ„νŠΈλ₯Ό μ‚¬μš©ν•œλ‹€.
  • κ°€μˆ˜λΆ€λŠ” 1.XXXX... ν˜•μ‹μ˜ μ†Œμˆ˜μ  μ΄ν•˜ 뢀뢄을 μ €μž₯ν•œλ‹€.(μ•”μ‹œμ  1이 쑴재)

 

IEEE 754 뢀동 μ†Œμˆ˜μ  ν˜•μ‹

Float(단정도, 32λΉ„νŠΈ)

floatλ₯Ό '단정도'라고도 λΆ€λ₯΄λ‚˜λ³΄λ‹€.

  • 1λΉ„νŠΈ : λΆ€ν˜Έ (Sign)
  • 8λΉ„νŠΈ : μ§€μˆ˜(Exponent)
  • 23λΉ„νŠΈ : κ°€μˆ˜(Mantissa)

Double(배정도, 64λΉ„νŠΈ)

double은 '배정도'라고도 λΆ€λ₯΄λ‚˜λ³΄λ‹€.

  • 1λΉ„νŠΈ : λΆ€ν˜Έ(Sign)
  • 11λΉ„νŠΈ : μ§€μˆ˜ (Exponent)
  • 52λΉ„νŠΈ : κ°€μˆ˜ (Mantissa)

 

μ •ν™•μ„±μ˜ ν•œκ³„

뢀동 μ†Œμˆ˜μ μ€ 맀우 큰 μˆ˜λ‚˜ 맀우 μž‘μ€ 수λ₯Ό ν‘œν˜„ν•  수 μžˆλŠ” μœ μ—°μ„±μ„ μ œκ³΅ν•˜μ§€λ§Œ, 정밀도(precision)와 κ΄€λ ¨ν•˜μ—¬ λͺ‡ 가지 ν•œκ³„κ°€ μ‘΄μž¬ν•œλ‹€ μ£Όμš” μ΄μœ λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

1. μœ ν•œν•œ λΉ„νŠΈ 수

μ •λ°€λ„μ˜ μ œν•œ

'float'λŠ” 32λΉ„νŠΈ, 'double'은 64λΉ„νŠΈλ‘œ ν‘œν˜„λœλ‹€. 이 λΉ„νŠΈ μˆ˜κ°€ κ³ μ •λ˜μ–΄ 있기 λ•Œλ¬Έμ— λͺ¨λ“  μ‹€μˆ˜λ₯Ό μ •ν™•ν•˜κ²Œ ν‘œν˜„ν•  수 μ—†λ‹€.

예λ₯Ό λ“€μ–΄, 'float'의 κ°€μˆ˜λΆ€λŠ” 23λΉ„νŠΈλ‘œ μ œν•œλ˜μ–΄ μžˆμ–΄ μ•½κ°„μ˜ 정밀도 손싀이 λ°œμƒν•  수 μžˆλ‹€.

2. λ¬΄ν•œν•œ μ‹€μˆ˜ μ§‘ν•©μ˜ ν‘œν˜„

μ‹€μˆ˜μ˜ λ¬΄ν•œμ„±

μ‹€μˆ˜λŠ” λ¬΄ν•œλŒ€μ— 걸쳐 μ‘΄μž¬ν•˜μ§€λ§Œ, μ»΄ν“¨ν„°λŠ” μœ ν•œν•œ λ©”λͺ¨λ¦¬λ§Œμ„ μ‚¬μš©ν•΄ μ‹€μˆ˜λ₯Ό ν‘œν˜„ν•΄μ•Ό ν•œλ‹€. μ΄λŠ” 정확도λ₯Ό 손싀할 수 밖에 μ—†κ²Œ λ§Œλ“ λ‹€.

예λ₯Ό λ“€μ–΄, 0.1을 μ •ν™•ν•˜κ²Œ μ΄μ§„μˆ˜λ‘œ ν‘œν˜„ν•  수 μ—†λ‹€.

3. κ·Όμ‚¬μΉ˜ ν‘œν˜„

κ·Όμ‚¬μΉ˜μ— μ˜ν•œ 였차

λ§Žμ€ μ‹€μˆ˜λŠ” 이진 뢀동 μ†Œμˆ˜μ  ν˜•μ‹μœΌλ‘œ μ •ν™•ν•˜κ²Œ ν‘œν˜„ν•  수 μ—†μœΌλ©°, μ΄λŠ” κ·Όμ‚¬μΉ˜λ‘œ μ €μž₯λœλ‹€.

μ΄λŸ¬ν•œ κ·Όμ‚¬μΉ˜ λ•Œλ¬΄λ„€ 뢀동 μ†Œμˆ˜μ  μ—°μ‚°μ—μ„œ μ˜€μ°¨κ°€ λˆ„μ λ  수 μžˆλ‹€.

4. μ •κ·œν™” 및 λΉ„μ •κ·œν™” 숫자

뢀동 μ†Œμˆ˜μ  숫자λ₯Ό ν‘œν˜„ν•  λ•Œ 컴퓨터 μ‹œμŠ€ν…œμ—μ„œ μ‹€μˆ˜λ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•œ 두 가지 ν˜•μ‹μœΌλ‘œ μ •κ·œν™” μˆ«μžμ™€ λΉ„μ •κ·œν™” 숫자λ₯Ό μ‚¬μš©ν•œλ‹€.

μ •κ·œν™”(Normalized) 숫자

μ •κ·œν™”λœ μˆ«μžλŠ” κ°€μˆ˜λΆ€κ°€ 1둜 μ‹œμž‘ν•˜λŠ” ν˜•μ‹μ„ 가진닀. κ·ΈλŸ¬λ‚˜ νŠΉμ • μƒν™©μ—μ„œλŠ” λΉ„μ •κ·œν™”λœ μˆ«μžκ°€ λ°œμƒν•  수 μžˆλ‹€.

 

상세 μ„€λͺ…

더보기

μ •κ·œν™” 숫자 Normalized Number

μ •κ·œν™”λœ μˆ«μžλŠ” 뢀동 μ†Œμˆ˜μ  ν‘œν˜„μ—μ„œ κ°€μž₯ 일반적인 ν˜•μ‹μœΌλ‘œ, μˆ«μžκ°€ κ°€μž₯ 효율적으둜 ν‘œν˜„λ˜λ„λ‘ ν•œλ‹€. μ •κ·œν™”λœ μˆ«μžλŠ” κ°€μˆ˜(Mantissa) 뢀뢄이 νŠΉμ • ν˜•μ‹μ„ 갖도둝 ν•΄ μ΅œλŒ€ν•œ λ§Žμ€ 유효 자릿수λ₯Ό μ‚¬μš©ν•œλ‹€.

ν‘œν˜„ 방식

μ •κ·œν™”λœ 뢀동 μ†Œμˆ˜μ  μˆ«μžλŠ” λ‹€μŒκ³Ό 같은 ν˜•μ‹μ„ κ°–λŠ”λ‹€.

μ •κ·œν™˜λœ 뢀동 μ†Œμˆ˜μ  숫자 ν˜•μ‹
  • λΆ€ν˜Έ λΉ„νŠΈ (Sign Bit) : μˆ«μžκ°€ μ–‘μˆ˜μΈμ§€ μŒμˆ˜μΈμ§€λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
  • μ§€μˆ˜(Exponent) : 숫자의 μŠ€μΌ€μΌμ„ μ‘°μ •ν•œλ‹€. μ •κ·œν™”λœ μˆ«μžλŠ” μ§€μˆ˜κ°€ νŠΉμ • λ²”μœ„ 내에 μžˆμ–΄μ•Ό ν•œλ‹€.
  • κ°€μˆ˜(Mantissa) : 1.XXXX ν˜•μ‹μœΌλ‘œ μ €μž₯λ˜μ–΄, 수수점 μ•„λž˜μ˜ 값을 ν‘œν˜„ν•œλ‹€. μ•”μ‹œμ  1(implicit 1)을 μ‚¬μš©ν•΄ νš¨μœ¨μ„±μœΌλ‘œ 높인닀.

νŠΉμ§•

  • μ•”μ‹œμ  1 : κ°€μˆ˜ 뢀뢄은 항상 1둜 μ‹œμž‘ν•œλ‹€. μ΄λŠ” μ‹€μ œλ‘œ μ €μž₯λ˜μ§€ μ•ŠμœΌλ©°, μ•”μ‹œμ μœΌλ‘œ κ°€μ •λœλ‹€.
  • μ΅œλŒ€ 유효 자릿수 : μ •κ·œν™”λœ ν˜•μ‹μ€ κ°€μˆ˜μ— κ°€μž₯ λ§Žμ€ 유효 자릿수λ₯Ό ν¬ν•¨ν•˜μ—¬ 숫자의 정확성을 높인닀.
  • μ§€μˆ˜ λ²”μœ„ : μ§€μˆ˜λŠ” νŠΉμ • λ²”μœ„ 내에 μžˆμ–΄μ•Ό ν•˜λ©°, 이λ₯Ό λ²—μ–΄λ‚˜λŠ” 경우 μ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•œλ‹€.

μ˜ˆμ‹œ

// μ˜ˆμ‹œ: μ •κ·œν™”λœ float κ°’
float example = 3.14f;

// IEEE 754 ν‘œν˜„:
Sign: 0
Exponent: 128 (0b10000000)
Mantissa: 0b10010011001100110011010 (μ •κ·œν™”λœ ν˜•μ‹)

 

이 경우, λΆ€ν˜Έ λΉ„νŠΈλŠ” 0(μ–‘μˆ˜), μ§€μˆ˜λŠ” 128(0을 κΈ°μ€€μœΌλ‘œ), κ°€μˆ˜λŠ” 0.31415926...이닀.

 

μž₯점

  • μ΅œλŒ€ 정밀도 제곡 : μ •κ·œν™”λœ ν˜•μ‹μ€ κ°€λŠ₯ν•œ μ΅œλŒ€ν•œμ˜ 유효 자릿수λ₯Ό μ œκ³΅ν•˜μ—¬ κ³„μ‚°μ˜ 정확성을 μœ μ§€ν•œλ‹€.
  • 효율적 μ €μž₯ : μ•”μ‹œμ  1을 μ‚¬μš©ν•΄μ„œ λΉ„νŠΈμ˜ μ‚¬μš©μ„ μ΅œμ†Œν™”ν•˜κ³  μ΅œλŒ€ν•œμ˜ 정보λ₯Ό μ €μž₯ν•œλ‹€.

λΉ„μ •κ·œν™”(Denormalized) 숫자

맀우 μž‘μ€ μˆ˜λŠ” λΉ„μ •κ·œν™”λ˜μ–΄ μ €μž₯되며, μ΄λŠ” κ°€μˆ˜μ˜ κ°€μž₯ μ•žμžλ¦¬κ°€ 0이 λœλ‹€. λΉ„μ •κ·œν™” μˆ«μžλŠ” 정밀도가 더 떨어진닀.

 

상세 μ„€λͺ…

더보기

λΉ„μ •κ·œν™” 숫자 Denormalized Number (= μ„œλΈŒλ…Έλ©€ κ°’ Subnormal Numbers)

λΉ„μ •κ·œν™”λœ μˆ«μžλŠ” 맀우 μž‘μ€ 숫자λ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•œ ν˜•μ‹μœΌλ‘œ, μ •κ·œν™”λœ ν˜•μ‹μ΄ μ œκ³΅ν•  수 μ—†λŠ” μž‘μ€ 값을 μ²˜λ¦¬ν•  수 μžˆλ„λ‘ ν•œλ‹€.

ν‘œν˜„ 방식

λΉ„μ •κ·œν™”λœ 뢀동 μ†Œμˆ˜μ  μˆ«μžλŠ” λ‹€μŒκ³Ό 같은 ν˜•μ‹μ„ κ°–λŠ”λ‹€.

λΉ„μ •κ·œν™” 숫자 ν‘œν˜„ ν˜•μ‹
  • λΆ€ν˜Έ λΉ„νŠΈ (Sign Bit) : 숫자의 λΆ€ν˜Έλ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
  • μ§€μˆ˜ (Exponent) : λͺ¨λ“  λΉ„νŠΈκ°€ 0인 경우 λΉ„μ •κ·œν™”λœ ν˜•μ‹μœΌλ‘œ κ°„μ£Όν•œλ‹€.
  • κ°€μˆ˜ (Mantissa) : 0.XXXX ν˜•μ‹μœΌλ‘œ μ €μž₯λ˜μ–΄, μ†Œμˆ˜μ  μ•„λž˜μ˜ 값을 ν‘œν˜„ν•œλ‹€. μ•”μ‹œμ  1이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

νŠΉμ§•

  • λͺ…μ‹œμ  0 : κ°€μˆ˜ 뢀뢄은 0으둜 μ‹œμž‘ν•œλ‹€. μ•”μ‹œμ  1이 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ, μ†Œμˆ˜μ  μ•„λž˜μ˜ 숫자만 ν¬ν•¨λœλ‹€.
  • ν™•μž₯된 λ²”μœ„ : λΉ„μ •κ·œν™”λœ ν˜•μ‹μœΌλ‘œ 0에 맀우 κ°€κΉŒμš΄ 값을 ν‘œν˜„ν•  수 μžˆλŠ” λŠ₯λ ₯을 μ œκ³΅ν•΄ λ²”μœ„λ₯Ό ν™•μž₯ν•œλ‹€.
  • 정밀도 손싀 : μ•”μ‹œμ  1이 μ—†κΈ° λ•Œλ¬Έμ— 정밀도가 λ–¨μ–΄μ§ˆ 수 μžˆλ‹€.

μ˜ˆμ‹œ

// μ˜ˆμ‹œ: λΉ„μ •κ·œν™”λœ float κ°’
float denormalExample = 1.4e-45f;

// IEEE 754 ν‘œν˜„:
Sign: 0
Exponent: 0 (λΉ„μ •κ·œν™” μƒνƒœ)
Mantissa: 0b00000000000000000000001 (λΉ„μ •κ·œν™”λœ ν˜•μ‹)

 

 μ΄ 경우, λΆ€ν˜Έ λΉ„νŠΈλŠ” 0, μ§€μˆ˜λŠ” 0(λΉ„μ •κ·œν™” μƒνƒœ), κ°€μˆ˜λŠ” κ°€μž₯ μž‘μ€ λΉ„νŠΈλ§Œ ν™œμ„±ν™”λœ μƒνƒœλ‹€.

 

μž₯점

  • ν™•μž₯된 ν‘œν˜„ λ²”μœ„ : 맀우 μž‘μ€ 값을 μ²˜λ¦¬ν•  수 μžˆλŠ” λŠ₯λ ₯을 μ œκ³΅ν•œλ‹€.
  • μ„œλΈŒλ…Έλ©€ κ°’ 좔리 : μ •κ·œν™”λœ ν˜•μ‹μœΌλ‘œ μ²˜λ¦¬ν•  수 μ—†λŠ” μ„œλΈŒλ…Έλ©€ 값을 ν‘œν˜„ν•  수 μžˆλ‹€.

 

더보기

μ •κ·œν™”μ™€ λΉ„μ •κ·œν™”μ˜ 차이점

νŠΉμ§• μ •κ·œν™” 숫자 λΉ„μ •κ·œν™” 숫자
κ°€μˆ˜ Mantissa μ•”μ‹œμ  1 포함(1.XXXX) λͺ…μ‹œμ  0 포함(0.XXXX)
정밀도 Precision μ΅œλŒ€ 유효 자릿수 제곡 κ°μ†Œλœ 정밀도
λ²”μœ„ Range 넓은 λ²”μœ„ ν‘œν˜„ 0에 κ°€κΉŒμš΄ μž‘μ€ κ°’ ν‘œν˜„
μ§€μˆ˜ Exponent 일반적인 λ²”μœ„ λ‚΄μ—μ„œ μ‚¬μš© λͺ¨λ“  λΉ„νŠΈκ°€ 0일 λ•Œ λΉ„μ •κ·œν™”λ‘œ κ°„μ£Ό
μœ νš¨μ„± Validity 맀우 μž‘μ€ μˆ˜λŠ” ν‘œν˜„ λΆˆκ°€ 맀우 μž‘μ€ 수 ν‘œν˜„ κ°€λŠ₯
μ˜€λ²„ν”Œλ‘œμš° Overflow 큰 κ°’ μ²˜λ¦¬μ— νš¨κ³Όμ • 맀우 μž‘μ€ μˆ˜μ—μ„œλ§Œ μ‚¬μš©
μ–Έλ”ν”Œλ‘œμš° Undreflow μ˜€λ²„ν”Œλ‘œμš° 및 μ–Έλ”ν”Œλ‘œμš° λ°œμƒ κ°€λŠ₯ μž‘μ€ 값에 λŒ€ν•œ μ–Έλ”ν”Œλ‘œμš° 방지

 

μ •κ·œν™”μ™€ λΉ„μ •κ·œν™”μ˜ ν™œμš©

μ •κ·œν™”

  • 주둜 일반적인 수치 κ³„μ‚°μ—μ„œ μ‚¬μš©λ˜λ©°, μ΅œλŒ€ν•œμ˜ 정밀도λ₯Ό μœ μ§€ν•œλ‹€.
  • κ³„μ‚°μ—μ„œ κ°€μž₯ 효율적인으둜 λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•΄, λŒ€λΆ€λΆ„μ˜ 뢀동 μ†Œμˆ˜μ  연산이 μ •κ·œν™”λœ μƒνƒœλ‘œ μ²˜λ¦¬λœλ‹€.

λΉ„μ •κ·œν™”

  • 맀우 μž‘μ€ 값을 λ‹€λ£° λ•Œ μ€‘μš”ν•˜λ©°, μ„œλΈŒλ…Έλ©€ 값이 ν•„μš”ν•œ μƒν™©μ—μ„œ μ‚¬μš©λœλ‹€.
  • 과학적 κ³„μ‚°μ—μ„œ 맀우 μž‘μ€ 값이 μ€‘μš”ν•  λ•Œ λΉ„μ •κ·œν™” μƒνƒœλ‘œ ν‘œν˜„λ˜μ–΄μ•Ό ν•œλ‹€.
  • λΉ„μ •κ·œν™”λœ μˆ«μžλŠ” 특히 μ–Έλ”ν”Œλ‘œμš°λ₯Ό λ°©μ§€ν•˜λŠ” 데 μœ μš©ν•˜λ‹€.

 

μ™œ λ²”μœ„λ₯Ό λ„˜μ–΄μ„œλ©΄ 정확성을 보μž₯ν•˜μ§€ λͺ»ν•˜λŠ”κ°€?

1. ν‘œν˜„ κ°€λŠ₯ν•œ 유효 자릿수 μ œν•œ

정밀도 μ œν•œ

'float'λŠ” μ•½ 7자리, 'double'은 μ•½ 15자리의 유효 자릿수(significant digits)만 μ •ν™•ν•˜κ²Œ ν‘œν˜„ν•  수 μžˆλ‹€. 이 ν•œκ³„λ₯Ό λ„˜μ–΄κ°€λŠ” 경우, 더 μž‘μ€ λ³€ν™”λŠ” λ°˜μ˜λ˜μ§€ μ•Šμ„ 수 μžˆλ‹€.

// μ˜ˆμ‹œ: float의 정밀도
float a = 1234567.0f; // μ •ν™•
float b = 12345678.0f; // λΆ€μ •ν™•, 반올림 λ°œμƒ

 

2. μ§€μˆ˜ λ²”μœ„μ˜ μ œν•œ

μ˜€λ²„ν”Œλ‘œμš°μ™€ μ–Έλ”ν”Œλ‘œμš°

'float'와 'double'은 ν‘œν˜„ κ°€λŠ₯ν•œ 수의 λ²”μœ„κ°€ ν•œμ •λ˜μ–΄ μžˆλ‹€. λ„ˆλ¬΄ 큰 κ°’μ΄λ‚˜ λ„ˆλ¬΄ μž‘μ€ 값은 μ˜€λ²„ν”Œλ‘œμš°(overflow)λ‚˜ μ–Έλ”ν”Œλ‘œμš°(underflow)둜 인해 λ¬΄ν•œλŒ€ λ˜λŠ” 0으둜 μ²˜λ¦¬λœλ‹€.

// μ˜ˆμ‹œ: float의 μ˜€λ²„ν”Œλ‘œμš°
float large = 3.4028235e38f; // μ΅œλŒ€κ°’μ— κ°€κΉŒμš΄ κ°’
float overflow = large * 2.0f; // Infinity

 

3. μ—°μ‚° 쀑 λˆ„μ  였차

μ—°μ‚° λˆ„μ  였λ₯˜

반볡적인 뢀동 μ†Œμˆ˜μ  연산은 λˆ„μ  였차λ₯Ό μ΄ˆλž˜ν•  수 μžˆλ‹€. μ΄λŠ” 특히 λ°˜λ³΅λ¬Έμ΄λ‚˜ λˆ„μ  κ³„μ‚°μ—μ„œ μ‹¬κ°ν•œ 영ν–₯을 λ―ΈμΉ  수 μžˆλ‹€.

// μ˜ˆμ‹œ: 뢀동 μ†Œμˆ˜μ  λˆ„μ  였차
float sum = 0.0f;
for (int i = 0; i < 100000; i++) {
    sum += 0.0001f;
}
System.out.println("Sum: " + sum); // μ˜ˆμƒ κ°’: 10.0, μ‹€μ œ 좜λ ₯: 9.999999

 

λŒ€μ•ˆ 및 ν•΄κ²° 방법

뢀동 μ†Œμˆ˜μ μ˜ 정밀도 문제λ₯Ό μ™„μ „νžˆ ν•΄κ²°ν•  μˆ˜λŠ” μ—†μ§€λ§Œ, λͺ‡ 가지 λŒ€μ•ˆμ„ 톡해 문제λ₯Ό μ™„ν™”ν•  수 μžˆλ‹€.

1. μ •μˆ˜ μ—°μ‚° μ‚¬μš©

κ°€λŠ₯ν•œ 경우 μ •μˆ˜ 연산을 μ‚¬μš©ν•΄ 정밀도λ₯Ό μœ μ§€ν•œλ‹€.

2. κ³ μ • μ†Œμˆ˜μ  ν‘œν˜„

κ³ μ • μ†Œμˆ˜μ (fixed-point) ν‘œν˜„μ„ μ‚¬μš©ν•΄ 정밀도λ₯Ό κ°œμ„ ν•œλ‹€.

3. 큰 수λ₯Ό λ‹€λ£° λ•Œ BigDecimal μ‚¬μš©

Java의 'BigDecimal' ν΄λž˜μŠ€λŠ” 뢀동 μ†Œμˆ˜μ  λŒ€μ‹  μ •ν™•ν•œ μ†Œμˆ˜ 연산을 μ œκ³΅ν•œλ‹€.

4. 계산 μˆœμ„œ μ΅œμ ν™”

계산 μˆœμ„œλ₯Ό λ³€κ²½ν•΄ 였차 λˆ„μ μ„ μ΅œμ†Œν™”ν•œλ‹€.

5. 였차 μ „νŒŒ 관리

μ€‘μš” μ—°μ‚° 전에 였차 μ „νŒŒλ₯Ό μ΅œμ†Œν™”ν•˜λ„λ‘ μ„€κ³„ν•œλ‹€.