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
μ λ
μ€νΈλ§λ λ§μ°¬κ°μ§λ‘ μλͺ»λμμ΅λλ€.
μ, μμ€ λ₯Ό 보면 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μ΄μ΄ λ¬Έμ λ₯Ό μ’ κ²°νλλ‘ κΆμ₯ν©λλ€.
κ°μ₯ μ μ©ν λκΈ
μ¬κΈ°μμ μ°λ¦¬λ κ±°μ 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_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μ΄ μ΄μ μ μ μν μ΄κΈ° μ΅μ μ€ νλλΌκ³ μκ°ν©λλ€. λν μ€λͺ μ μμ κ°μ μΆκ°ν©λλ€.
epsnegμ λ μ€νΈλ§λ λ§μ°¬κ°μ§λ‘ μλͺ»λμμ΅λλ€.