Numpy: DOC : numpy.finfo.eps의 독 슀트링이 잘λͺ»λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2016λ…„ 01μ›” 05일  Β·  5μ½”λ©˜νŠΈ  Β·  좜처: numpy/numpy

numpy.finfo 의 독 슀트링 은 ν˜„μž¬ eps 속성을 λ‹€μŒκ³Ό 같이 μ •μ˜ν•©λ‹ˆλ‹€.

1.0 + eps! = 1.0κ³Ό 같은 ν‘œν˜„ κ°€λŠ₯ν•œ κ°€μž₯ μž‘μ€ μ–‘μˆ˜μž…λ‹ˆλ‹€. [...]

이 μ •μ˜λŠ” 적어도 IEEE 754 λ°”μ΄λ„ˆλ¦¬ ν˜•μ‹μ˜ 일반적인 κ²½μš°μ—λŠ” μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 일반적인 반올림 λͺ¨λ“œμ—μ„œ IEEE 754 binary64 ν˜•μ‹μ„ μ‚¬μš©ν•˜λŠ” 경우 λͺ…μ‹œλœ μ •μ˜λŠ” 2**-53 + 2**-105 (μ•½ 1.1102230246251568e-16 )의 값을 μ œκ³΅ν•©λ‹ˆλ‹€. 2**-52 의 μ˜¬λ°”λ₯Έ κ°€μΉ˜μ˜ 절반 이상 (μ•½ 2.220446049250313e-16 ).

In [36]: eps = 2**-53 + 2**-105

In [37]: eps
Out[37]: 1.1102230246251568e-16

In [38]: 1.0 + eps != 1.0
Out[38]: True

In [39]: 1.0 + np.nextafter(eps, -np.inf) != 1.0
Out[39]: False

In [40]: np.finfo(float).eps
Out[40]: 2.2204460492503131e-16

λͺ‡ 가지 κ°€λŠ₯ν•œ 단어 λ³€κ²½ :

1.0 + epsλ₯Ό ν‘œν˜„ν•  μˆ˜μžˆλŠ” κ°€μž₯ μž‘μ€ μ–‘μˆ˜μž…λ‹ˆλ‹€.

λ˜λŠ”:

1.0κ³Ό 1.0보닀 큰 ν‘œν˜„ κ°€λŠ₯ν•œ κ°€μž₯ μž‘μ€ 뢀동 μ†Œμˆ˜μ  μ‚¬μ΄μ˜ μ°¨μ΄μž…λ‹ˆλ‹€.

λ˜λŠ” nextafter μΈ‘λ©΄μ—μ„œ λ‹€μŒκ³Ό 같이 μ •μ˜ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

np.nextafter(1.0, np.inf) - 1.0 의 κ°’μž…λ‹ˆλ‹€.

비ꡐλ₯Ό μœ„ν•΄ C99 ν‘œμ€€μ˜ μ„Ήμ…˜ 5.2.4.2.2, 단락 11은 λ‹€μ–‘ν•œ *_EPSILON 맀크둜 ( DBL_EPSILON , FLT_EPSILON , ...)λ₯Ό λ‹€μŒκ³Ό 같이 μ •μ˜ν•©λ‹ˆλ‹€.

1κ³Ό 주어진 뢀동 μ†Œμˆ˜μ  μœ ν˜• b 1βˆ’ p μ—μ„œ ν‘œν˜„ν•  μˆ˜μžˆλŠ” 1보닀 큰 μ΅œμ†Œκ°’μ˜ 차이

epsneg 의 독 μŠ€νŠΈλ§λ„ λ§ˆμ°¬κ°€μ§€λ‘œ 잘λͺ»λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

00 - Bug Triaged Documentation

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ—¬κΈ°μ—μ„œ μš°λ¦¬λŠ” 거의 4 λ…„ 후이며 이것은 μˆ˜μ •λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. https://github.com/numpy/numpy/pull/14618 이이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 데 μΆ©λΆ„ν•˜μ§€ μ•Šλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

버그 λ³΄κ³ μ„œλ₯Ό λͺ…ν™•νžˆν•˜κΈ° μœ„ν•΄ 독 μŠ€νŠΈλ§μ—μžˆλŠ” eps의 ν˜„μž¬ μ •μ˜λŠ” np.finfoκ°€ λ°˜ν™˜ ν•œ eps κ°’μ—μ„œ μ•½ 2 λ°° 정도 λ–¨μ–΄μ Έ μžˆμŠ΅λ‹ˆλ‹€. (μ•„λž˜μ— 제곡된 μˆ«μžλŠ” IEEE-754 64 λΉ„νŠΈ 뢀동 μ†Œμˆ˜μ  ν‘œμ€€μ„ μ‚¬μš©ν•œ κ΅¬ν˜„μ„μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€.) 즉,

np.finfo (1.0) .eps = 2 **-52 = 2.220446049250313e-16

κ·ΈλŸ¬λ‚˜ 독 μŠ€νŠΈλ§μ€ epsλ₯Ό λ‹€μŒκ³Ό 같이 μ •μ˜ν•©λ‹ˆλ‹€.

"1.0 + eps! = 1.0κ³Ό 같은 ν‘œν˜„ κ°€λŠ₯ν•œ κ°€μž₯ μž‘μ€ μ–‘μˆ˜."

1.0 + eps_min! = 1.0 μ •μ˜λ₯Ό λ§Œμ‘±ν•˜λŠ” eps의 μ‹€μ œ 값은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

eps_min = 2-53 + 2 -105 = 1.1102230246251568e-16

μ΄λŠ” np.finfo (1.0) .eps의 ν˜„μž¬ κ°€μΉ˜μ˜ 거의 1/2μž…λ‹ˆλ‹€. μ—­ ν˜Έν™˜μ„±μ„ μœ μ§€ν•˜κΈ° μœ„ν•΄ np.finfo (1.0) .eps의 값을 λ³€κ²½ν•˜κ³  μ‹Άμ§€λŠ” μ•Šμ§€λ§Œ eps의 독 슀트링 μ •μ˜λŠ” 계산 된 것과 μΌμΉ˜ν•˜λ„λ‘ μˆ˜μ •ν•΄μ•Όν•©λ‹ˆλ‹€. np.finfo (1.0) eps의 μ†ŒμŠ€ μ½”λ“œλŠ” numpy.MachAr을 μ‚¬μš©ν•˜κ³ , κ±°κΈ°μ—μžˆλŠ” λ¬Έμ„œλ₯Ό 보면 2 외에 λ‹€λ₯Έ κΈ°λ°˜μ„ ν—ˆμš©ν•˜λŠ” λ¬Έμ„œλ₯Ό 보면 eps의 κ°€μž₯ 쒋은 μ •μ˜λŠ” @mdickinson이 이전에 μ œμ•ˆν•œ 초기 μ˜΅μ…˜ 쀑 ν•˜λ‚˜λΌκ³  μƒκ°ν•©λ‹ˆλ‹€. λ˜ν•œ μ„€λͺ…에 예제 값을 μΆ”κ°€ν•©λ‹ˆλ‹€.

"1.0κ³Ό 1.0보닀 큰 ν‘œν˜„ κ°€λŠ₯ν•œ κ°€μž₯ μž‘μ€ 뢀동 μ†Œμˆ˜μ μ˜ 차이. (IEEE-754 ν‘œμ€€μ—μ„œ 64 λΉ„νŠΈ 이진 λΆ€λ™μ˜ 경우 eps = 2 **-52 β‰… 2.22e-16.)"

epsneg의 독 μŠ€νŠΈλ§λ„ λ§ˆμ°¬κ°€μ§€λ‘œ 잘λͺ»λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  5 λŒ“κΈ€

μ•„, μ†ŒμŠ€ λ₯Ό 보면 eps 이 μ‹€μ œλ‘œ 1 + eps != eps 와 같이 2_의 κ°€μž₯ μž‘μ€ _ 제곱으둜 κ³„μ‚°λ©λ‹ˆλ‹€. μ΄λŠ” 1.0 와 1.0 μ—μ„œ λ‹€μŒ ν‘œν˜„ κ°€λŠ₯ν•œ 뢀동 μ†Œμˆ˜μ  μ‚¬μ΄μ˜ 차이와 같지 μ•Šμ§€λ§Œ 두 가지가 IEEE 754와 λ°˜μ˜¬λ¦Όμ—μ„œ 짝수둜 λ°˜μ˜¬λ¦Όλ©λ‹ˆλ‹€. 방법. λ”°λΌμ„œ μœ„μ—μ„œ μ œμ•ˆν•œ 단어 변경은 μœ νš¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ•„λ§ˆλ„ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

1.0 + epsλ₯Ό ν‘œν˜„ν•  μˆ˜μžˆλŠ” 2의 μ΅œμ†Œ κ±°λ“­ μ œκ³±μž…λ‹ˆλ‹€.

더 μ’‹μ„κΉŒμš”? κΈ°μˆ μ μœΌλ‘œλŠ” 2 λ₯Ό 뢀동 μ†Œμˆ˜μ  기수둜 λ°”κΏ”μ•Όν•˜μ§€λ§Œ λΆˆν•„μš”ν•˜κ²Œ ν˜„λͺ… ν•  수 μžˆμŠ΅λ‹ˆλ‹€. NumPyλŠ” ν˜„μž¬ 기수 10 λ˜λŠ” 기수 16 뢀동 μ†Œμˆ˜μ μ„ μ§€μ›ν•©λ‹ˆκΉŒ?

[μ œμ™Έλ‘œ μ—‘μ‹€λ‘ μ˜ C99 μŠ€νƒ€μΌ μ •μ˜λ₯Ό μ„ ν˜Έν•©λ‹ˆλ‹€. ν˜•μ‹ 만 ν¬ν•¨ν•˜κ³  뢀동 μ†Œμˆ˜μ  μΆ”κ°€μ˜ μ˜λ―Έμ— μ˜μ‘΄ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 특히 C99 μ •μ˜λŠ” ν˜„μž¬ μœ νš¨ν•œ 반올림 λͺ¨λ“œμ— μ˜μ‘΄ν•˜μ§€ μ•Šμ§€λ§Œ 1 + eps != 1 μ •μ˜λŠ” κ·Έλ ‡μŠ΅λ‹ˆλ‹€.]

"μ°Έκ³  ν•­λͺ©"μ„Ήμ…˜μ—μ„œ np.spacing 및 np.nextafter 에 λŒ€ν•œ 포인터도 잠재적으둜 μœ μš©ν•©λ‹ˆλ‹€.

μ—¬κΈ°μ—μ„œ μš°λ¦¬λŠ” 거의 4 λ…„ 후이며 이것은 μˆ˜μ •λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. https://github.com/numpy/numpy/pull/14618 이이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 데 μΆ©λΆ„ν•˜μ§€ μ•Šλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

버그 λ³΄κ³ μ„œλ₯Ό λͺ…ν™•νžˆν•˜κΈ° μœ„ν•΄ 독 μŠ€νŠΈλ§μ—μžˆλŠ” eps의 ν˜„μž¬ μ •μ˜λŠ” np.finfoκ°€ λ°˜ν™˜ ν•œ eps κ°’μ—μ„œ μ•½ 2 λ°° 정도 λ–¨μ–΄μ Έ μžˆμŠ΅λ‹ˆλ‹€. (μ•„λž˜μ— 제곡된 μˆ«μžλŠ” IEEE-754 64 λΉ„νŠΈ 뢀동 μ†Œμˆ˜μ  ν‘œμ€€μ„ μ‚¬μš©ν•œ κ΅¬ν˜„μ„μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€.) 즉,

np.finfo (1.0) .eps = 2 **-52 = 2.220446049250313e-16

κ·ΈλŸ¬λ‚˜ 독 μŠ€νŠΈλ§μ€ epsλ₯Ό λ‹€μŒκ³Ό 같이 μ •μ˜ν•©λ‹ˆλ‹€.

"1.0 + eps! = 1.0κ³Ό 같은 ν‘œν˜„ κ°€λŠ₯ν•œ κ°€μž₯ μž‘μ€ μ–‘μˆ˜."

1.0 + eps_min! = 1.0 μ •μ˜λ₯Ό λ§Œμ‘±ν•˜λŠ” eps의 μ‹€μ œ 값은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

eps_min = 2-53 + 2 -105 = 1.1102230246251568e-16

μ΄λŠ” np.finfo (1.0) .eps의 ν˜„μž¬ κ°€μΉ˜μ˜ 거의 1/2μž…λ‹ˆλ‹€. μ—­ ν˜Έν™˜μ„±μ„ μœ μ§€ν•˜κΈ° μœ„ν•΄ np.finfo (1.0) .eps의 값을 λ³€κ²½ν•˜κ³  μ‹Άμ§€λŠ” μ•Šμ§€λ§Œ eps의 독 슀트링 μ •μ˜λŠ” 계산 된 것과 μΌμΉ˜ν•˜λ„λ‘ μˆ˜μ •ν•΄μ•Όν•©λ‹ˆλ‹€. np.finfo (1.0) eps의 μ†ŒμŠ€ μ½”λ“œλŠ” numpy.MachAr을 μ‚¬μš©ν•˜κ³ , κ±°κΈ°μ—μžˆλŠ” λ¬Έμ„œλ₯Ό 보면 2 외에 λ‹€λ₯Έ κΈ°λ°˜μ„ ν—ˆμš©ν•˜λŠ” λ¬Έμ„œλ₯Ό 보면 eps의 κ°€μž₯ 쒋은 μ •μ˜λŠ” @mdickinson이 이전에 μ œμ•ˆν•œ 초기 μ˜΅μ…˜ 쀑 ν•˜λ‚˜λΌκ³  μƒκ°ν•©λ‹ˆλ‹€. λ˜ν•œ μ„€λͺ…에 예제 값을 μΆ”κ°€ν•©λ‹ˆλ‹€.

"1.0κ³Ό 1.0보닀 큰 ν‘œν˜„ κ°€λŠ₯ν•œ κ°€μž₯ μž‘μ€ 뢀동 μ†Œμˆ˜μ μ˜ 차이. (IEEE-754 ν‘œμ€€μ—μ„œ 64 λΉ„νŠΈ 이진 λΆ€λ™μ˜ 경우 eps = 2 **-52 β‰… 2.22e-16.)"

epsneg의 독 μŠ€νŠΈλ§λ„ λ§ˆμ°¬κ°€μ§€λ‘œ 잘λͺ»λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” λ˜ν•œμ΄ 뢀정확성을 μš°μ—°νžˆ λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. 이 문제λ₯Ό ν•΄κ²°ν•΄μ•Όν•©λ‹ˆλ‹€.

참고둜 Matlab은 eps (λ™μΌν•œ κ°’)을 "1.0μ—μ„œ λ‹€μŒμœΌλ‘œ 큰 λ°°μ • 밀도 숫자, 즉 2 ^ -52κΉŒμ§€μ˜ 거리"둜 λ¬Έμ„œν™” ν•©λ‹ˆλ‹€.

반올림 문제둜 인해 ν˜„μž¬ μ •μ˜κ°€ μ˜¬λ°”λ₯΄μ§€ μ•Šκ³  ν˜Όλž€ μŠ€λŸ½μŠ΅λ‹ˆλ‹€. @gwhammett μ œμ•ˆ 된 μ •μ˜λŠ” μ •ν™•ν•˜κ³  더 μ„€λͺ… 적이며 PR이이 문제λ₯Ό μ’…κ²°ν•˜λ„λ‘ ꢌμž₯ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰