νƒœκ·Έ 보관물: floating-point

floating-point

뢀동 μ†Œμˆ˜μ μ—μ„œ 두 숫자의 평균에 λŒ€ν•œ κ°•λ ₯ν•œ 계산? 뢀동 μ†Œμˆ˜μ  μˆ«μžν•©λ‹ˆλ‹€. 평균을 κ³„μ‚°ν•˜λŠ”

ν•˜μž x, y두 개의 뢀동 μ†Œμˆ˜μ  μˆ«μžν•©λ‹ˆλ‹€. 평균을 κ³„μ‚°ν•˜λŠ” μ˜¬λ°”λ₯Έ 방법은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

μˆœμ§„ 방법은 (x+y)/2μ˜€λ²„ ν”Œλ‘œμš°κ°€ λ°œμƒν•  λ•Œ 수 x와 yλ„ˆλ¬΄ ν½λ‹ˆλ‹€. λ‚΄ 생각 μ—” 0.5 * x + 0.5 * yμ•„λ§ˆλ„ 더 λ‚˜μ€,ν•˜μ§€λ§Œ (μ•„λ§ˆλ„ λΉ„νš¨μœ¨μ  인)이 κ³±μ…ˆμ„ 포함, 그것은 μΆ©λΆ„νžˆ 쒋은 κ²½μš°μ— λ‚˜λŠ” ν™•μ‹€ν•˜μ§€ μ•Šλ‹€. 더 쒋은 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

λ‚΄κ°€ λ†€κ³ μžˆλŠ” 또 λ‹€λ₯Έ μ•„μ΄λ””μ–΄λŠ” (y/2)(1 + x/y)if x<=yμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‹€μ‹œ, λ‚˜λŠ” 이것을 λΆ„μ„ν•˜λŠ” 방법을 λͺ¨λ₯΄κ² κ³  그것이 λ‚΄ μš”κ΅¬ 사항을 μΆ©μ‘±ν•œλ‹€λŠ” 것을 증λͺ…ν•©λ‹ˆλ‹€.

λ˜ν•œ 계산 된 평균이 >= min(x,y)및 일 κ²ƒμ΄λΌλŠ” 보μž₯이 ν•„μš”ν•©λ‹ˆλ‹€ <= max(x,y). Don Hatch의 λ‹΅λ³€ μ—μ„œ 지적 ν–ˆλ“―μ΄μ΄ μ§ˆλ¬Έμ„ μ œκΈ°ν•˜λŠ” 더 쒋은 방법은 μ•„λ§ˆλ„ κ°€μž₯ μ •ν™•ν•œ κ²°κ³Όλ₯Ό μ œκ³΅ν•˜λŠ” 두 숫자의 평균 κ΅¬ν˜„μ€ λ¬΄μ—‡μž…λ‹ˆκΉŒ? 경우 즉, x및 y뢀동 μ†Œμˆ˜μ  μˆ«μžλŠ” μ–΄λ–»κ²Œ 뢀동 μ†Œμˆ˜μ  μˆ«μžμ— κ°€μž₯ κ°€κΉŒμš΄μ„ κ³„μ‚°ν•˜λŠ” (x+y)/2? 이 경우 계산 평균은 μžλ™ >= min(x,y)이며 <= max(x,y)μž…λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ Don Hatch의 λ‹΅λ³€ 을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

μ°Έκ³  : μš°μ„  μˆœμœ„λŠ” κ°•λ ₯ν•œ μ •ν™•μ„±μž…λ‹ˆλ‹€. νš¨μœ¨μ„±μ΄ μ†Œλͺ¨λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ κ°•λ ₯ν•˜κ³  μ •ν™•ν•œ μ•Œκ³ λ¦¬μ¦˜μ΄ λ§Žμ€ 경우 κ°€μž₯ 효율적인 μ•Œκ³ λ¦¬μ¦˜μ„ μ„ νƒν•©λ‹ˆλ‹€.



λ‹΅λ³€

Higham의 수치 μ•Œκ³ λ¦¬μ¦˜ 의 μ •ν™•μ„±κ³Ό μ•ˆμ •μ„±μ€ μ΄λŸ¬ν•œ μœ ν˜•μ˜ 문제λ₯Ό 뢄석 ν•  μˆ˜μžˆλŠ” 방법을 닀루고 μžˆλ‹€κ³  생각 ν•©λ‹ˆλ‹€. 2 μž₯, 특히 μš΄λ™ 2.8을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

이 λ‹΅λ³€μ—μ„œ λ‚˜λŠ” Higham의 μ±…μ—μ„œ μ‹€μ œλ‘œ 닀루지 μ•Šμ€ 것을 μ§€μ ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€ (κ·Έ λ¬Έμ œμ— λŒ€ν•΄μ„œλŠ” 널리 μ•Œλ €μ§€μ§€ μ•Šμ€ κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€). 이와 같은 κ°„λ‹¨ν•œ 수치 μ•Œκ³ λ¦¬μ¦˜μ˜ 속성을 증λͺ… ν•˜λ €λŠ” 경우 Haskell의 sbv 와 같은 νŒ¨ν‚€μ§€λ₯Ό μ‚¬μš©ν•˜μ—¬ z3 κ³Ό 같은 μ΅œμ‹  SMT 솔버 ( λ§Œμ‘±λ„ λͺ¨λ“ˆλ‘œ 이둠 ) 의 κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€ . 이것은 μ—°ν•„κ³Ό 쒅이λ₯Ό μ‚¬μš©ν•˜λŠ” 것보닀 λ‹€μ†Œ μ‰½μŠ΅λ‹ˆλ‹€.

μ£Όμ–΄μ‘Œκ³  z = ( x + y ) / 2 κ°€ x ≀ z ≀ yλ₯Ό 만쑱 ν•˜λŠ”μ§€ μ•Œκ³  μ‹ΆμŠ΅λ‹ˆλ‹€ . λ‹€μŒ ν•˜μŠ€μΌˆ μ½”λ“œ

0≀x≀y

z=(x+y)/2

x≀z≀y
import Data.SBV

test1 :: (SFloat -> SFloat -> SFloat) -> Symbolic SBool
test1 fun =
  do [x, y] <- sFloats ["x", "y"]
     constrain $ bnot (isInfiniteFP x) &&& bnot (isInfiniteFP y)
     constrain $ 0 .<= x &&& x .<= y
     let z = fun x y
     return $ x .<= z &&& z .<= y

test2 :: (SFloat -> SFloat -> SFloat) -> Symbolic SBool
test2 fun =
  do [x, y] <- sFloats ["x", "y"]
     constrain $ bnot (isInfiniteFP x) &&& bnot (isInfiniteFP y)
     constrain $ x .<= y
     let z = fun x y
     return $ x .<= z &&& z .<= y

이 μž‘μ—…μ„ μžλ™μœΌλ‘œ μˆ˜ν–‰ν•˜κ² μŠ΅λ‹ˆλ‹€ . λ‹€μŒ test1 fun은 IS λͺ…μ œλŠ” κ·Έ λͺ¨λ“  μœ ν•œ 수레 X , Y 와 0 ≀ X ≀ Y .

x≀fun(x,y)≀y

x,y

0≀x≀y
Ξ»> prove $ test1 (\x y -> (x + y) / 2)
Falsifiable. Counter-example:
  x = 2.3089316e36 :: Float
  y = 3.379786e38 :: Float

λ„˜μΉœλ‹€. 이제 λ‹€λ₯Έ 곡식을 μ·¨ν•œλ‹€κ³  κ°€μ • ν•΄λ³΄μ‹­μ‹œμ˜€

z=x/2+y/2
Ξ»> prove $ test1 (\x y -> x/2 + y/2)
Falsifiable. Counter-example:
  x = 2.3509886e-38 :: Float
  y = 2.3509886e-38 :: Float

점진적 언더 ν”Œλ‘œλ‘œ 인해 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ ( λͺ¨λ“  μ‚°μˆ μ΄ κΈ°λ³Έ 2 μ΄λ―€λ‘œ 직관적이지 μ•Šμ„ 수 있음).

(x/2)Γ—2β‰ x

이제 :

z=x+(yβˆ’x)/2
Ξ»> prove $ test1 (\x y -> x + (y-x)/2)
Q.E.D.

곡μž₯! λŠ” Q.E.D.AλŠ” 증거 것을 test1μœ„μ—μ„œ μ •μ˜ 된 속성은 λͺ¨λ“  수레λ₯Ό μœ„ν•΄ λ³΄μœ ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λ™μΌν•˜μ§€λ§Œ ( 0 ≀ x ≀ y λŒ€μ‹ )둜 μ œν•œλ˜λŠ” 것은 μ–΄λ–»μŠ΅λ‹ˆκΉŒ?

x≀y

0≀x≀y
Ξ»> prove $ test2 (\x y -> x + (y-x)/2)
Falsifiable. Counter-example:
  x = -3.1300826e34 :: Float
  y = 3.402721e38 :: Float

자, λ„˜μΉ˜λ©΄ z = x + ( y / 2 – x / 2 )λŠ” μ–΄λ–»μŠ΅λ‹ˆκΉŒ?

yβˆ’x

z=x+(y/2βˆ’x/2)
Ξ»> prove $ test2 (\x y -> x + (y/2 - x/2))
Q.E.D.

κ·Έλž˜μ„œ λ‚΄κ°€ μ—¬κΈ°μ—μ„œ μ‹œλ„ν•œ μˆ˜μ‹ 쀑 κ°€ μž‘λ™ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€ (증거와 ν•¨κ»˜). SMT 솔버 접근법은 μ—°ν•„κ³Ό μ’…μ΄λ‘œ 뢀동 μ†Œμˆ˜μ  였λ₯˜ 뢄석을 μˆ˜ν–‰ν•˜λŠ” 것보닀 κ°„λ‹¨ν•œ 뢀동 μ†Œμˆ˜μ  μˆ˜μ‹μ— λŒ€ν•œ μ˜μ‹¬μ— 훨씬 λΉ λ₯Έ λ°©λ²•μœΌλ‘œ λ³΄μž…λ‹ˆλ‹€.

x+(y/2βˆ’x/2)

λ§ˆμ§€λ§‰μœΌλ‘œ μ •ν™•μ„±κ³Ό μ•ˆμ •μ„±μ˜ λͺ©ν‘œλŠ” μ’…μ’… μ„±λŠ₯의 λͺ©ν‘œμ™€ μƒμΆ©λ©λ‹ˆλ‹€. μ„±λŠ₯을 μœ„ν•΄, λ‚˜λŠ” μ»΄νŒŒμΌλŸ¬κ°€ 보닀 λ‚˜μ€ 방법을 μ‹€μ œλ‘œ 보지 λͺ»ν•©λ‹ˆλ‹€ . 특히 μ»΄νŒŒμΌλŸ¬λŠ” 이것을 기계 λͺ…λ Ήμ–΄λ‘œ λ²ˆμ—­ν•˜λŠ” 데 λ§Žμ€ λ…Έλ ₯을 기울이고 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

(x+y)/2

PS 이것은 λͺ¨λ‘ 단 정밀도 IEEE754 뢀동 μ†Œμˆ˜μ  μ‚°μˆ μž…λ‹ˆλ‹€. λ‚˜λŠ” 검사 λ°°μ • 밀도 μ—°μ‚° (ꡐ체와λ₯Ό ν•¨κ»˜ ), 그것도 μž‘λ™ν•©λ‹ˆλ‹€.

x≀x+(y/2βˆ’x/2)≀y

SFloatSDouble

-ffast-math

(x+y)/2

PPPS 쑰건뢀없이 κ°„λ‹¨ν•œ λŒ€μˆ˜μ  ν‘œν˜„ 만 μ‚΄νŽ΄ λ³΄μ•˜μŠ΅λ‹ˆλ‹€ . 돈 ν•΄μΉ˜ 의 곡식 은 μ—„μ²­λ‚˜κ²Œ μ’‹μŠ΅λ‹ˆλ‹€.


λ‹΅λ³€

첫째, λͺ¨λ“  κ²½μš°μ— κ°€μž₯ μ •ν™•ν•œ 닡변을 μ œκ³΅ν•˜λŠ” 방법이 μžˆλ‹€λ©΄ ν•„μš”ν•œ 쑰건을 λ§Œμ‘±μ‹œν‚¬ κ²ƒμž…λ‹ˆλ‹€. (μ£Ό λ‚΄κ°€ 말할 것을 λ³΄λ‹€λŠ” κ°€μž₯ μ •ν™•ν•œ λ‹΅ κ°€μž₯ μ •ν™•ν•œ λŒ€λ‹΅μ€, 이후이 μŠΉμžκ°€μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.) 증λͺ… : λ§Œμ•½μ΄, λ°˜λŒ€λ‘œ, 당신은 μ•ŠλŠ” μ •ν™•ν•œ 것과 같이 κ°€λŠ₯ν•œ λŒ€λ‹΅μ΄ μ—†λ‹€ , κ·Έ μš”κ΅¬ 쑰건을 λ§Œμ‘±μ„ μ–΄λŠ μˆ˜λ‹¨ (μΌ€μ΄μŠ€κ°€λ˜λŠ” λ˜λŠ” 더 μ•ŠμŒ λͺ¨μˆœμ΄λ‹€) (μΌ€μ΄μŠ€κ°€μžˆλŠ” 더 μ•ŠμŒ λͺ¨μˆœμ΄λ‹€).answer<min(x,y)<=max(x,y)min(x,y)min(x,y)<=max(x,y)<answermax(x,y)

λ”°λΌμ„œ κ·€ν•˜μ˜ 질문이 κ°€μž₯ μ •ν™•ν•œ 닡변을 μ°ΎλŠ” κ²ƒμœΌλ‘œ μš”μ•½λ©λ‹ˆλ‹€. IEEE754 μ‚°μˆ  전체λ₯Ό κ°€μ •ν•˜λ©΄ λ‹€μŒμ„ μ œμ•ˆν•©λ‹ˆλ‹€.

if max(abs(x),abs(y)) >= 1.:
    return x/2. + y/2.
else:
    return (x+y)/2.

이것이 κ°€μž₯ μ •ν™•ν•œ 닡변을 μ œκ³΅ν•œλ‹€λŠ” μ£Όμž₯은 λ‹€μ†Œ μ§€λ£¨ν•œ 사둀 λΆ„μ„μž…λ‹ˆλ‹€. κ°„λ‹€ :

  • 사둀 max(abs(x),abs(y)) >= 1.:

    • ν•˜μœ„ μΌ€μ΄μŠ€ x와 yλŠ” λΉ„μ •κ·œ ν™”λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.이 경우 계산 된 λ‹΅λ³€ x/2.+y/2.은 λ™μΌν•œ κ°€μˆ˜λ₯Ό μ‘°μž‘ν•˜λ―€λ‘œ (x+y)/2μ˜€λ²„ν”Œλ‘œλ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ ν™•μž₯ 된 μ§€μˆ˜λ₯Ό κ°€μ •ν•˜λ©΄ μ‚°μΆœλŸ‰ κ³Ό μ •ν™•νžˆ λ™μΌν•œ 닡변을 μ œκ³΅ν•©λ‹ˆλ‹€ . 이 닡변은 반올림 λͺ¨λ“œμ— 따라 λ‹€λ₯Ό 수 μžˆμ§€λ§Œ μ–΄λ–€ κ²½μš°μ΄λ“  IEEE754λŠ” μ΅œμƒμ˜ λ‹΅λ³€μž„μ„ x+y보μž₯ ν•©λ‹ˆλ‹€ (계산 된 κ°’ 이 μˆ˜ν•™ x + y에 κ°€μž₯ κ°€κΉŒμš΄ 근사값을 보μž₯ ν•œλ‹€λŠ” μ‚¬μ‹€μ—μ„œ 2둜 λ‚˜λˆˆ 값은 μ •ν™•ν•©λ‹ˆλ‹€) μΌ€μ΄μŠ€).
    • ν•˜μœ„ 사둀 xλŠ” λΉ„μ •κ·œ ν™”λ˜μ—ˆμŠ΅λ‹ˆλ‹€ abs(y)>=1.

      answer = x/2. + y/2.
      = y/2. since abs(x/2.) is so tiny compared to abs(y/2.)
      = the exact mathematical value of y/2
      = a best possible answer.

    • ν•˜μœ„ 사둀 yλŠ” λΉ„μ •κ·œ ν™”λ˜μ–΄ abs(x)>=1μžˆμŠ΅λ‹ˆλ‹€.

  • 사둀 max(abs(x),abs(y)) < 1.:
    • 계산 된 ν•˜μœ„ μ‚¬λ‘€λŠ” x+yλΉ„μ •κ·œ ν™” λ˜λŠ” λΉ„μ •κ·œ ν™” 및 β€œμ§μˆ˜β€μž…λ‹ˆλ‹€. 계산 x+y이 μ •ν™• ν•˜μ§€λŠ” μ•Šμ§€λ§Œ IEEE754μ—μ„œλŠ” μˆ˜ν•™ x + y에 λŒ€ν•œ κ°€λŠ₯ν•œ 근사값을 보μž₯ν•©λ‹ˆλ‹€. 이 경우 μ‹μ—μ„œ 2둜 λ‚˜λˆˆ μ΄ν›„μ˜ (x+y)/2.μ •ν™•ν•œ λ‚˜λˆ„κΈ° μ΄λ―€λ‘œ 계산 된 λ‹΅ (x+y)/2.은 μˆ˜ν•™ (x + y) / 2에 λŒ€ν•œ κ°€μž₯ κ·Όμ‚¬μΉ˜μž…λ‹ˆλ‹€.
    • 계산 된 ν•˜μœ„ 사둀 x+yλŠ” λΉ„μ •κ·œ ν™”λ˜κ³  β€œν™€μˆ˜β€μž…λ‹ˆλ‹€.이 경우 μ •ν™•νžˆ x, y 쀑 ν•˜λ‚˜λŠ” λΉ„μ •κ·œ ν™” 및 β€œν™€μˆ˜β€μ—¬μ•Όν•©λ‹ˆλ‹€. 즉, x, y 쀑 λ‹€λ₯Έ ν•˜λ‚˜λŠ” λ°˜λŒ€ λΆ€ν˜Έλ‘œ λΉ„μ •κ·œ ν™”λ˜μ–΄ 계산 x+yλ©λ‹ˆλ‹€. μ •ν™•ν•˜κ²Œ μˆ˜ν•™ x + yμ΄λ―€λ‘œ (x+y)/2.IEEE754λŠ” μˆ˜ν•™ (x + y) / 2에 λŒ€ν•œ κ°€λŠ₯ν•œ 근사값을 κ³„μ‚°ν•©λ‹ˆλ‹€.

λ‹΅λ³€

binary64(이쀑 정밀도) κ³„μ‚°μœΌλ‘œ μ˜ˆμ‹œ 된 IEEE-754 이진 뢀동 μ†Œμˆ˜μ  ν˜•μ‹μ˜ 경우 S. BoldoλŠ” μ•„λž˜μ— ν‘œμ‹œλœ κ°„λ‹¨ν•œ μ•Œκ³ λ¦¬μ¦˜μ΄ 올림 된 평균을 μ œκ³΅ν•¨μ„ κ³΅μ‹μ μœΌλ‘œ 증λͺ…ν–ˆμŠ΅λ‹ˆλ‹€.

Sylvie Boldo, β€œλΆ€λ™ μ†Œμˆ˜μ  평균을 κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ˜ 곡식 검증.” μ—μ„œ 곡식 μ—”μ§€λ‹ˆμ–΄λ§ 방법에 κ΄€ν•œ ꡭ제 회의 , PP. 17-32. Cham, Springer, 2015. ( 온라인 μ΄ˆμ•ˆ )

(x+y)/2

x/2+y/2

binary64

C∈[2βˆ’967,2970]

C

νŠΉμ • μ‚¬μš© 사둀에 κ°€μž₯ μ ν•©ν•œ μ„±λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같은 예제 ISO-C99μ½”λ“œκ°€ μƒμ„±λ©λ‹ˆλ‹€.

double average (double x, double y)
{
    const double C = 1; /* 0x1p-967 <= C <= 0x1p970 */
    return (C <= fabs (x)) ? (x / 2 + y / 2) : ((x + y) / 2);
}

졜근 후속 μž‘μ—…μ—μ„œ S. Boldo와 곡동 μ €μžλŠ” FMA (fused multiply-add) μ—°μ‚°κ³Ό 잘 μ•Œλ €μ§„ 정밀도λ₯Ό μ‚¬μš©ν•˜μ—¬ IEEE-754 10 μ§„μˆ˜ 뢀동 μ†Œμˆ˜μ  ν˜•μ‹μ— λŒ€ν•΄ μ΅œμƒμ˜ κ²°κ³Όλ₯Ό μ–»λŠ” 방법을 λ³΄μ—¬μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. λ°°κ°€ λΉŒλ”© 블둝 (TwoSum) :

Sylvie Boldo, Florian Faissole 및 Vincent Tourneur, β€œμ •ν™•ν•œ 10 μ§„μˆ˜ 뢀동 μ†Œμˆ˜μ  수의 평균을 κ³„μ‚°ν•˜λŠ” κ³΅μ‹μ μœΌλ‘œ μž…μ¦ 된 μ•Œκ³ λ¦¬μ¦˜β€ μ—μ„œ 컴퓨터 μ‚°μˆ  (ARITH 25)에 25 IEEE 심포지엄 6 μ›” 2018 PP. 69-75. ( μ΄ˆμ•ˆ 온라인 )


λ‹΅λ³€

그것은 맀우 효율적인 μ„±λŠ₯ ν˜„λͺ…ν•œμ— μ•„μ£Ό κ°„λ‹¨ν•œ λ°©λ²•μ΄λ˜μ§€ μ•Šμ„ 수 μžˆμ§€λ§Œ (1) 숫자의 확인 것도 이상 μ—†λŠ”μ§€ ν™•μΈν•˜κ±°λ‚˜ xλ˜λŠ” y(NO μ˜€λ²„ ν”Œλ‘œμš°)κ³Ό (2) 둜 β€œμ •ν™•ν•œβ€λΆ€λ™ μ†Œμˆ˜μ μ„ μœ μ§€ λΊ„μ…ˆμ΄ μ‚¬μš© λ˜λ”λΌλ„ κ°€λŠ₯ν•œ μΆ”κ°€ (및 (3)) 값은 음수둜 μ €μž₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

float difference = max(x, y) - min(x, y);
return min(x, y) + (difference / 2.0);

당신이 κ²½μš°μ— μ‹€μ œλ‘œ, 정말 정확성을 μœ„ν•΄ κ°€κ³  μ‹Άμ–΄, 당신도 κ·Έ μžλ¦¬μ—μ„œ 뢄할을 μˆ˜ν–‰ ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€; λ‹¨μ§€μ˜ 값을 λ°˜ν™˜ min(x, y)ν•˜κ³  differenceλ…Όλ¦¬μ μœΌλ‘œ λ‹¨μˆœν™” 이상 μ‘°μž‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


λ‹΅λ³€

더 높은 μ •λ°€λ„λ‘œ λ³€ν™˜ν•˜κ³  거기에 값을 μΆ”κ°€ ν•œ ν›„ λ‹€μ‹œ λ³€ν™˜ν•˜μ‹­μ‹œμ˜€.

더 높은 μ •λ°€λ„μ—λŠ” μ˜€λ²„ν”Œλ‘œκ°€ μ—†μ–΄μ•Όν•˜λ©° λ‘˜ λ‹€ μœ νš¨ν•œ 뢀동 μ†Œμˆ˜μ  λ²”μœ„μ— 있으면 계산 된 μˆ«μžλ„ 내뢀에 μžˆμ–΄μ•Όν•©λ‹ˆλ‹€.

그리고 그것듀이 μ •ν™•ν•˜μ§€ μ•ŠμœΌλ©΄ μ΅œμ•…μ˜ 경우 큰 숫자의 μ ˆλ°˜μ— ν•΄λ‹Ήν•©λ‹ˆλ‹€.


λ‹΅λ³€

이둠적으둜 x/2κ°€μˆ˜μ—μ„œ 1을 λΉΌμ„œ 계산할 수 μžˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ μ‹€μ œλ‘œ 이와 같은 λΉ„νŠΈ 연산을 κ΅¬ν˜„ν•˜λŠ” 것이 λ°˜λ“œμ‹œ κ°„λ‹¨ν•œ 것은 μ•„λ‹™λ‹ˆλ‹€. 특히 뢀동 μ†Œμˆ˜μ  숫자의 ν˜•μ‹μ„ λͺ¨λ₯΄λŠ” 경우 특히 κ·Έλ ‡μŠ΅λ‹ˆλ‹€.

이 μž‘μ—…μ„ μˆ˜ν–‰ ν•  수 있으면 전체 μž‘μ—…μ΄ 3 λ”ν•˜κΈ° / 빼기둜 κ°μ†Œλ˜μ–΄ 크게 κ°œμ„  될 κ²ƒμž…λ‹ˆλ‹€.


λ‹΅λ³€

@Roland Heath와 같은 쀄을 μƒκ°ν•˜κ³  μžˆμ—ˆμ§€λ§Œ 아직 μ–ΈκΈ‰ ν•  μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€.

x/2μ§€μˆ˜ μ—μ„œ 1을 λΉΌμ„œ 계산할 수 μžˆμŠ΅λ‹ˆλ‹€ (κ°€μˆ˜κ°€ μ•„λ‹ˆλΌ κ°€μˆ˜μ—μ„œ 1을 λΉΌλ©΄ 2^(value_of_exponent-length_of_mantissa)전체 κ°’μ—μ„œ λΉΌκΈ° ).

일반적인 경우λ₯Ό μ œν•œν•˜μ§€ μ•Šκ³ λ₯Ό κ°€μ • ν•΄ λ΄…μ‹œλ‹€ x < y. (경우 x > y, λ³€μˆ˜ λ ˆμ΄λΈ”μ„ 재.ν•˜λ©΄ x = y, (x+y) / 2κ°„λ‹¨ν•˜λ‹€.)

  • λ³€ν˜• (x+y) / 2으둜 x/2 + y/2, (μ§€μˆ˜μ—μ„œ ν•˜λ‚˜) 개의 μ •μˆ˜ λΊ„μ…ˆμ— μ˜ν•΄ μˆ˜ν–‰ 될 μˆ˜μžˆλŠ”
    • κ·ΈλŸ¬λ‚˜ ν‘œν˜„μ— 따라 μ§€μˆ˜μ— ν•˜ν•œμ΄ μžˆμŠ΅λ‹ˆλ‹€. 1을 λΉΌκΈ° 전에 μ§€μˆ˜κ°€ 이미 μ΅œμ†Œ 인 경우이 방법은 νŠΉλ³„ν•œ 경우 μ²˜λ¦¬κ°€ ν•„μš”ν•©λ‹ˆλ‹€. μ΅œμ†Œ μ§€μˆ˜ λŠ” ν‘œν˜„ν•  xμˆ˜μžˆλŠ” 것 x/2보닀 μž‘κ²Œ λ§Œλ“€ κ²ƒμž…λ‹ˆλ‹€ (μœ λ‹ˆν‹°κ°€ μ•”μ‹œ 적 μ„ ν–‰ 1둜 ν‘œμ‹œλœλ‹€κ³  κ°€μ •).
    • λŒ€μ‹  μ§€μˆ˜μ—μ„œ 1을 감산 x, μ‰¬ν”„νŠΈ x(μžˆλŠ” 경우, 상기 μ•”μ‹œ 적 선두 1을 μΆ”κ°€)을 순차적으둜 우츑으둜의 κ°€μˆ˜.
    • μ΅œμ†Œκ°’μ΄ μ•„λ‹Œ 경우 y의 μ§€μˆ˜μ—μ„œ 1을 λΊλ‹ˆλ‹€. μ΅œμ†Œκ°’ (yλŠ” κ°€μˆ˜λ‘œ 인해 x보닀 큼) 인 경우, κ°€μˆ˜λ₯Ό 였λ₯Έμͺ½μœΌλ‘œ ν•˜λ‚˜μ”© μ΄λ™ν•©λ‹ˆλ‹€ (μžˆλŠ” 경우 μ•”μ‹œ 적 μ„ ν–‰ 1 μΆ”κ°€).
    • x의 μ§€μˆ˜μ— 따라 μƒˆ κ°€μˆ˜λ₯Ό 였λ₯Έμͺ½μœΌλ‘œ μ΄λ™ν•©λ‹ˆλ‹€ y.
    • κ°€μˆ˜κ°€ xμ™„μ „νžˆ 이동 λ˜μ§€ μ•Šμ€ 경우 κ°€μˆ˜μ— μ •μˆ˜λ₯Ό λ”ν•©λ‹ˆλ‹€ . 두 μ§€μˆ˜κ°€ λͺ¨λ‘ μ΅œμ†Œ 인 경우 μ„ ν–‰ν•˜λŠ” μ˜€λ²„ν”Œλ‘œκ°€ λ°œμƒν•©λ‹ˆλ‹€. μ˜€λ²„ν”Œλ‘œλŠ” μ•”μ‹œ 적 μ„ ν–‰ λ¦¬λ”κ°€λ˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
  • ν•˜λ‚˜μ˜ 뢀동 μ†Œμˆ˜μ  μΆ”κ°€.
    • νŠΉλ³„ν•œ κ²½μš°λŠ” 생각할 수 μ—†μŠ΅λ‹ˆλ‹€. λ°˜μ˜¬λ¦Όμ„ μ œμ™Έν•˜κ³ λŠ” μœ„μ—μ„œ μ„€λͺ…ν•œ 이동에도 μ μš©λ©λ‹ˆλ‹€.