written by yechoi

(λ²ˆμ—­) λΆ€λ™μ†Œμˆ˜μ μ„ μ΄ν•΄ν•˜κ³  μ‚¬μš©ν•˜κΈ° λ³Έλ¬Έ

Born 2 Code/C, C++

(λ²ˆμ—­) λΆ€λ™μ†Œμˆ˜μ μ„ μ΄ν•΄ν•˜κ³  μ‚¬μš©ν•˜κΈ°

yechoi 2020. 11. 1. 15:21
λ°˜μ‘ν˜•

πŸ‘‰μ΄ 글은 Jeff Bezanson의 Understanding and Using Floating Point Numbersλ₯Ό λ²ˆμ—­ν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μ†Œ μ˜μ—­ν•œ 뢀뢄이 있으며, μ˜€μ—­ν•œ 뢀뢄이 μžˆλ‹€λ©΄ λŒ“κΈ€μ„ λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.  

 

C++ Article - Understanding Floating Point Numbers - Cprogramming.com

Understanding and Using Floating Point Numbers by Jeff Bezanson Numbers are surely the most prevalent kind of data in computer programs. They are so fundamental that people don't spend much time talking about them—surely everybody knows how to use number

www.cprogramming.com

 

μˆ«μžκ°€ 컴퓨터 ν”„λ‘œκ·Έλž¨μ—μ„œ κ°€μž₯ ν”ν•œ λ°μ΄ν„°λΌλŠ” 것은 ν™•μ‹€ν•©λ‹ˆλ‹€. λ„ˆλ¬΄λ‚˜λ„ 기초적인 λ‚˜λ¨Έμ§€ μ‚¬λžŒλ“€μ€ μˆ«μžμ— λŒ€ν•΄ 많이 λ…Όμ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λͺ¨λ“  μ‚¬λžŒλ“€μ€ ν”„λ‘œκ·Έλž¨μ—μ„œ 숫자λ₯Ό μ‚¬μš©ν•˜λŠ” 방법을 μ•Œκ³  μžˆλ‹€κ³  μƒκ°ν•΄μš”. κ·Έλ ‡μ§€λ§Œ ν”„λ‘œκ·Έλž˜λ°μ˜ μ„Έκ³„μ—μ„œ κ°€μž₯ ν™˜μƒμ μΈ 것 쀑 ν•˜λ‚˜λŠ” 당신이 λ§ˆμ£Όν•˜λŠ” λͺ¨λ“  것이 μƒμƒμ΄μƒμ΄λΌλŠ” 것이죠.

 

λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ€ λΆ€λ™μ†Œμˆ˜μ  μ‹€μˆ˜μ— λŒ€ν•΄ μ΄μƒν•œ 점을 λ“£κ±°λ‚˜ 봀을 κ²ƒμž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μš°λ¦¬λŠ” μ’…μ’… κ°™μ•„ λ³΄μ΄λŠ” λΆ€λ™μ†Œμˆ˜μ  μ‹€μˆ˜κ°€ C의 '==' 쑰건에 λΆ€ν•©ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 λ°œκ²¬ν•˜κ³€ ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 이유둜 초보 ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ€ λΆ€λ™μ†Œμˆ˜μ  μ‹€μˆ˜μ—λŠ” ==λ₯Ό μ ˆλŒ€ μ‚¬μš©ν•˜μ§€ μ•Šλ„λ‘ λ°°μš°κΈ°λ„ ν•˜μ£ . λ•Œλ•Œλ‘œ μš°λ¦¬λŠ” λ‹€λ₯Έ μ˜ˆμ™Έμ μΈ κ²½μš°μ— λΆ€λ”ͺνžˆκΈ°λ„ ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ μˆ˜ν•™μ μœΌλ‘œ 말이 λ˜λŠ” μˆ˜μ‹μ΄, λΆ€λ™μ†Œμˆ˜μ μ„ μ“°κΈ°λ§Œ ν•˜λ©΄ μ‹€λ§μŠ€λŸ¬μšΈ μ •λ„λ‘œ μ •ν™•ν•˜μ§€ μ•Šκ±°λ‚˜ λ¬΄μž‘μœ„μ˜ κ²°κ³Όλ₯Ό 내뱉기도 ν•©λ‹ˆλ‹€.

 

μ–΄λ–€ 일이 μΌμ–΄λ‚˜λŠ” κ±ΈκΉŒμš”? λΆ€λ™μ†Œμˆ˜μ  μ‹€μˆ˜μ— κ΄€ν•΄μ„  직관에 μ–΄κΈ‹λ‚˜λŠ” 것듀이 많고, μ΄λŸ¬ν•œ νŠΉμ„± λ•Œλ¬Έμ— μš°λ¦¬λŠ” λΆ€λ™μ†Œμˆ˜μ  μ‹€μˆ˜λ₯Ό ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©ν•˜λ©΄μ„œ μ—¬λŸ¬κ°€μ§€λ₯Ό 배우게 λ©λ‹ˆλ‹€.

 

λΆ€λ™μ†Œμˆ˜μ  μ‹€μˆ˜λŠ” μ°©μ‹œ 효과λ₯Ό μΌμœΌν‚΅λ‹ˆλ‹€. 10μ§„λ²•μ΄λ‚˜ μ•„μ£Ό μž‘κ±°λ‚˜ 큰 μˆ˜λ‘œλ„ ν‘œν˜„λ˜λ©΄μ„œ ’μ‹€μ œ’ 숫자처럼 λ³΄μ΄λŠ” κ±°μ£ . ν˜„μ‹€μ—μ„œ 같은 4λ°”μ΄νŠΈλ‘œ ν‘œν˜„ν•œλ‹€κ³  ν–ˆμ„ λ•Œ, μ‹€μˆ˜λ³΄λ‹¨ μ •μˆ˜λ₯Ό μ œλŒ€λ‘œ ν‘œν˜„ν•©λ‹ˆλ‹€. μ΄μœ λŠ” λ‹Ήμ—°ν•˜κ²Œλ„ 뢀동 μ†Œμˆ˜μ  μ‹€μˆ˜μ— λŒ€ν•œ 내뢀적인 ν‘œν˜„μ΄ κ°„λ‹¨ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. μ •μˆ˜λ₯Ό ν‘œν˜„ν•˜λŠ” λΉ„νŠΈλŠ” κ·Έ 자체둜 μ΄μ§„λ²•μ˜ μˆ˜μ΄μ§€λ§Œ, λΆ€λ™μ†Œμˆ˜μ  μ‹€μˆ˜λ₯Ό ν‘œν˜„ν•˜λŠ” λΉ„νŠΈλŠ” 쒀더 λ³΅μž‘ν•˜κ²Œ ν•΄μ„λ©λ‹ˆλ‹€. 이 ν‘œν˜„λ²•μ— λŒ€ν•΄μ„  λ‚˜μ€‘μ— 길게 μ„€λͺ…ν•˜λ„λ‘ ν•˜κ³ , λ¨Όμ € μ •μˆ˜μ™€ μ‹€μˆ˜μ˜ κ°œλ…μ μΈ 차이λ₯Ό μ•Œμ•„λ³΄λ„λ‘ ν• κ²Œμš”.

 

 

1. Accuracy vs. Precision

 

μΈ‘μ • κ°œλ… μ€‘μ—μ„œ Accuracy와 Precision은 μ •μˆ˜μ™€ μ‹€μˆ˜μ˜ λ‹€λ₯Έ νŠΉμ„±μ„ 잘 μ„€λͺ…ν•©λ‹ˆλ‹€(μ–΄λ–€ μ‹œμŠ€ν…œμ—μ„œλ„, μ–΄λ–€ μ†Œμˆ˜ ν‘œν˜„λ²•μ΄ μ‚¬μš©λ˜λ”λΌλ„ μ΄λŠ” λ§ˆμ°¬κ°€μ§€μ˜ˆμš”.). "accuracy"λŠ” μΈ‘μ •μΉ˜κ°€ μ‹€μ œ 값에 μ–Όλ§ˆλ‚˜ λΉ„μŠ·ν•œμ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ°’μž…λ‹ˆλ‹€. 반면 "precision"은 양에 κ΄€ν•΄ μ–Όλ§ˆ 만큼의 정보λ₯Ό 가지고 μžˆλŠ”μ§€, 이λ₯Ό 당신이 μ–Όλ§ˆλ‚˜ λ…μ°½μ μœΌλ‘œ ν‘œν˜„ν•΄λƒˆλŠ”μ§€μ— 관련돼 μžˆμŠ΅λ‹ˆλ‹€.

 

μ •μˆ˜ 계산은 μ™„λ²½νžˆ μ •ν™•ν•΄μš”. (μ •μˆ˜ "2"κ°€ μžˆλ‹€λ©΄, 그건 μ •ν™•νžˆ 2인거죠. λˆ„κ΅¬λ„ 이 사싀에 이의 μ œκΈ°ν•  순 μ—†μ–΄μš”.) λ”μš±μ΄ 여기에 1을 λ”ν•˜λ©΄, μ •ν™•νžˆ 3을 얻을 κ²ƒμ΄λž€ κ±Έ μ•Œμ£ . μ •μˆ˜λ‘œ μ–΄λ–€ 계산에 ν•˜λ“  간에, μ˜€λ²„ν”Œλ‘œμš°λ§Œ μ—†λ‹€λ©΄μ•Ό λΉ„νŠΈ λ‹¨μœ„λ‘œ μ •ν™•ν•œ 수λ₯Ό μ–»κ²Œ 될 κ²λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ •μˆ˜μ—” precision이 λΆ€μ‘±ν•΄μš”. 예λ₯Ό λ“€μ–΄ 5와 4λ₯Ό 각각 2둜 λ‚˜λˆ„λ©΄, λ‘˜λ‹€ 2λΌλŠ” κ²°κ³Όλ₯Ό λ‚΄μš”. μ •μˆ˜λŠ” μ‘°κ°λ‚œ 뢀뢄에 λŒ€ν•΄μ„  정보λ₯Ό 가지고 μžˆμ§€ μ•Šμ•„μš”. 4보닀 μ•½κ°„ 크고 5λ³΄λ‹€λŠ” μž‘μ€ μˆ˜κ°€ μžˆλ‹€κ³  ν•˜λ©΄, 4보닀 큰 λΆ€λΆ„μ˜ μ •λ³΄λŠ” μžƒμ–΄λ²„λ¦¬μ£ . μ •μˆ˜λŠ” λ―Έμ„Έν•œ λ³€ν™”λ₯Ό λŒ€ν‘œν•˜κΈ°μ—” λ„ˆλ¬΄ νˆ¬λ°•ν•΄μš”. μ •μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 건 λ²½λŒμ„ μŒ“λŠ” 것과 κ°™μ£ . μ •μœ‘λ©΄μ²΄λ₯Ό λ§Œλ“ λ‹€λ©΄ 벽돌이 μ•„μ£Ό λ”±μ΄κ² μ§€λ§Œ, ꡬλ₯Ό λ§Œλ“ λ‹€κ³  μƒκ°ν•˜λ©΄ λ²½λŒμ€ κ·Έλ‹₯ 쒋은 선택은 μ•„λ‹ˆμ£ . (ꡬ가 λ²½λŒλ³΄λ‹€ μ•„μ£Ό 크닀면, λΉ„μŠ·ν•˜κ²Œ λ§Œλ“€μ–΄λ³Ό μˆ˜λŠ” μžˆκ² λ„€μš”.)

 

νΌν‹°λ‘œ λ²½λŒμ„ μŒ“μ•„ μ˜¬λ¦¬λŠ” λͺ¨μŠ΅

 

μ‹€μˆ˜λŠ” accuracy와 precision에 μžˆμ–΄μ„œ μ •μˆ˜μ™€ μ •λ°˜λŒ€μž…λ‹ˆλ‹€. 당신이 ν‘œν˜„ν•˜λ €λŠ” μˆ˜μ— λŒ€ν•œ 정보λ₯Ό μ˜λ„μ μœΌλ‘œ λ²„λ¦¬λŠ” 일은 μ ˆλŒ€ μ—†μœΌλ―€λ‘œ 쒋은 precision을 가지고 μžˆμ–΄μš”. λΉ„νŠΈλ§Œ λ§Žλ‹€λ©΄ μ›λž˜μ˜ 수λ₯Ό μ–»κΈ° μœ„ν•΄ μ–΄λ–€ FP 계산도 되돌릴 수 있죠. 마치 λΉ„νŠΈλ§Œ μΆ©λΆ„ν•˜λ©΄ μ•„μ£Ό 큰 μ •μˆ˜λ„ ν‘œν˜„ν•  수 μžˆλŠ” κ²ƒμ²˜λŸΌμš”. κ·ΈλŸ¬λ‚˜ μ†Œμˆ˜μ μ΄ μžˆλŠ” μˆ˜λŠ” 정확도가 λΆ€μ‘±ν•©λ‹ˆλ‹€. μ •μˆ˜κ°€ λ²½λŒκ°™λ‹€λ©΄, μ‹€μˆ˜λŠ” λ©μ²­ν•œ 퍼티 κ°™μ•„μš”. λ³΅μž‘ν•œ 곑면 λͺ¨μ–‘에 λ°”λ₯΄λ„둝 ν†΅μ œν•  μˆ˜λŠ” μžˆμ§€λ§Œ, μ•„μ£Ό λ”± 맞게 μΉ ν•˜λ €λ©΄ μ‚μ Έλ‚˜μ˜€μ£ . νΌν‹°λ‘œ μ™„λ²½ν•œ μ •μœ‘λ©΄μ²΄λ₯Ό λ§Œλ“ λ‹€κ³  μƒκ°ν•΄λ³΄μ„Έμš”. λͺ¨μ„œλ¦¬ 뢀뢄을 μ™„λ²½ν•˜κ²Œ λ‚ μΉ΄λ‘­κ²Œ λ§Œλ“€ 순 없을 κ±°μ˜ˆμš”. 사싀 λ§Žμ€ κ²½μš°μ—μ„œ μ†Œμˆ˜μ  숫자의 κ²°κ³Όκ°€ μ‹€μ œ μˆ˜μ™€ λΉ„νŠΈ λ‹¨μœ„λ‘œ μ •ν™•νžˆ μΌμΉ˜ν•˜λ¦¬λΌκ³  κΈ°λŒ€ν•˜λŠ” 건 λ§κ·ΈλŒ€λ‘œ κ°€λ§μ—†λŠ” μΌμž…λ‹ˆλ‹€.

 

λͺ¨λ“  면이 λ°”μ΄λ„ˆλ¦¬μ—μ„œ μ •ν™•νžˆ ν‘œν˜„λ  μˆ˜λŠ” μ—†λ‹€λŠ” μ μ—μ„œ μ‹€μˆ˜λŠ” νƒœμƒμ μœΌλ‘œ μ •μˆ˜μ™€ λ‹€λ¦…λ‹ˆλ‹€. λ°”μ΄λ„ˆλ¦¬ 계산을 νƒ“ν•˜λŠ” 건 μ•„λ‹™λ‹ˆλ‹€. μ–΄λ–€ 진법 μ‹œμŠ€ν…œμ—μ„œλ„ μ΄λŸ¬ν•œ μ œμ•½μ€ λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€. 1/3을 μƒκ°ν•΄λ³΄μ„Έμš”. λλ‚˜μ§€ μ•ŠλŠ” 10진법 ν‘œν˜„(e.g 0.333333)도 1/3κ³Ό κ°™λ‹€κ³  ν•  수 μ—†μ£ . 3을 끝도 없이 κ°€μ Έλ‹€ 쓴닀해도 μ •ν™•ν•˜κ²Œ ν‘œν˜„ν•  수 없을 κ²λ‹ˆλ‹€. λ”°λΌμ„œ ν•œμ •λœ μ†Œμˆ˜μ  자리수둠 κ³„μ‚°λœ κ²°κ³Όλ₯Ό μ •ν™•νžˆ ν‘œν˜„ν•  수 μ—†λ‹€κ³  λ³΄λŠ” 게 λ‚«κ² λ„€μš”. 당신이 λ¬΄μ–Όν•˜λ“  κ²°κ³ΌλŠ” μ‹€μ œμ™€ μ‘°κΈˆμ€ 틀릴 수 밖에 μ—†μŠ΅λ‹ˆλ‹€. κ·ΈλŸΌμ—λ„ μš°λ¦¬λŠ” μ‹€μˆ˜κ°€ μ—¬μ „νžˆ μœ μš©ν•˜λ‹€λŠ” 것을 μ•ŒκΈ° λ•Œλ¬Έμ—, 반올림 μ—λŸ¬ 상황을 νŒŒμ•…ν•΄ 문제λ₯Ό λ°©μ§€ν•˜λŠ” 편이 λ‚«μ£ . 이λ₯Ό μœ„ν•΄μ„œλ‚˜ μ•„λ‹ˆλ©΄ ꡐ양을 μœ„ν•΄μ„œλΌλ„, μ†Œμˆ˜κ°€ μ‹€μ œλ‘œ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ μ•„λŠ” 건 쒋은 μΌμž…λ‹ˆλ‹€.

λ°˜μ‘ν˜•