<p>numpy.isclose ๋Œ€ math.isclose</p>

์— ๋งŒ๋“  2017๋…„ 12์›” 05์ผ  ยท  78์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: numpy/numpy

numpy.isclose (https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.isclose.html) :

abs(a - b) <= (atol + rtol * abs(b))

math.isclose (https://docs.python.org/3/library/math.html#math.isclose) :

abs(a - b) <= max(rtol * max(abs(a), abs(b)), atol)

Numpy์˜ ๋ฐฉ์ •์‹์€ ๋Œ€์นญ์ด ์•„๋‹ˆ๊ณ  atol ๋ฐ rtol ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์—ฐ๊ด€์‹œํ‚ต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๋‚˜์œ ๊ฒƒ (IMO)์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ Numpy๊ฐ€ ๋‘ ์ˆซ์ž๋ฅผ ๋™์ผํ•˜๊ฒŒ "์ž˜๋ชป"ํ‘œ์‹œํ•˜๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

a = 0.142253
b = 0.142219
rtol = 1e-4
atol = 2e-5

# true because atol interferes with the rtol measurement
abs(a - b) <= (atol + rtol * abs(b))
Out[24]: True

# correct result, rtol fails
abs(a - b) <= max(rtol * max(abs(a), abs(b)), atol)
Out[29]: False

์—ฌ๊ธฐ์— ๋˜ ํ•˜๋‚˜์˜ ๋Œ€์นญ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

a = 0.142253
b = 0.142219
rtol = 1e-4
atol = 1.9776e-05

# relative to b
abs(a - b) <= (atol + rtol * abs(b))
Out[73]: False

#relative to a
abs(a - b) <= (atol + rtol * abs(a))
Out[74]: True

# math one has no problems with this
abs(a - b) <= max(rtol * max(abs(a), abs(b)), atol)
Out[75]: False

ํŒŒ์ด์ฌ ์ˆ˜ํ•™ ๋ฒ„์ „์€ ๋ฐฉํƒ„์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. Numpy๊ฐ€ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? Numpy ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค ์ด์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

57 - Close?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@njsmith : ๋ฐ๋ ค์™€ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์•ฝ๊ฐ„์˜ ์—ญ์‚ฌ : ๋‚ด๊ฐ€ stdlib์— ๋Œ€ํ•ด isclose๋ฅผ ์ œ์•ˆํ–ˆ์„ ๋•Œ ์šฐ๋ฆฌ๋Š” ํ™•์‹คํžˆ numpy๋ฅผ ์„ ํ–‰ ๊ธฐ์ˆ ๋กœ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋งŒ ์žˆ์—ˆ๋‹ค๋ฉด ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :-).

ํ•˜์ง€๋งŒ ๋‚˜๋จธ์ง€ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ƒ๊ฐ์€ ํŒŒ์ด์ฌ์— "์˜ฌ๋ฐ”๋ฅธ"์ผ์„ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธด ํ† ๋ก ์ด ์ด์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ €๋Š” PEP์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ์š”์ ์„ ํฌ์ฐฉํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ numpy์— ๋Œ€ํ•œ ์ฐธ์กฐ์ž…๋‹ˆ๋‹ค.

https://www.python.org/dev/peps/pep-0485/#numpy -isclose

์ด ํ† ๋ก ์—์„œ์™€ ๋™์ผํ•œ ์š”์ ์ด ๋งŒ๋“ค์–ด ์กŒ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ์‚ฌํ•ญ์ด ๋‚˜์™”์Šต๋‹ˆ๋‹ค.

1) ๋Œ€์นญ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ตœ์†Œํ•œ์˜ ๋†€๋ผ์›€์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค.

2) ์ธ์ˆ˜์˜ ํฌ๊ธฐ์— ๋Œ€ํ•œ ๊ฐ€์ •์„ํ•˜์ง€ ์•Š๋„๋ก ๊ธฐ๋ณธ ์ ˆ๋Œ€ ํ—ˆ์šฉ ์˜ค์ฐจ๋Š” ์•„๋งˆ๋„ 0์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

3) "์•ฝํ•œ"ํ…Œ์ŠคํŠธ์™€ "๊ฐ•ํ•œ"ํ…Œ์ŠคํŠธ์˜ ์ฐจ์ด๋Š” ์˜ˆ์ƒ๋˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž‘์€ ํ—ˆ์šฉ ์˜ค์ฐจ๋กœ ์‚ฌ์šฉ๋  ๋•Œ ๋ฌด๊ด€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์šฐ๋ฆฌ๊ฐ€ math.isclose๋ฅผ์œ„ํ•œ "์ตœ๊ณ ์˜"์†”๋ฃจ์…˜์„ ์ƒ๊ฐํ•ด ๋ƒˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ๊ธฐ์— ์ถฉ๋ถ„ํ• ๋งŒํผ "๋” ๋‚˜์€"๊ฐ€์š”? ๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ๋งŽ์€ numpy (๋ฐ python)์—๋Š” ์œ ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์ง€๋งŒ ํ˜„์žฌ ๋…ผ์˜๊ฐ€ ๋งŽ์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์— ๋Œ€ํ•ด ๋งŽ์€ ์ฐจ์„ ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ Š์€ ๋„์„œ๊ด€์— ์˜ˆ์ƒ๋˜๋Š” (ํ•„์š”ํ•œ) ๊ฒƒ์ด๋ฉฐ, ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ ๊ทธ๊ฒƒ๊ณผ ํ•จ๊ป˜ ์‚ด์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

@njsmith ๊ฐ€ ๋งž์Šต๋‹ˆ๋‹ค-np.isclose ()์˜ ์‚ฌ์šฉ์€ ์—„๊ฒฉํ•œ FP ์˜ค๋ฅ˜ ๋ถ„์„์— ์˜ํ•ด ์„ค์ •๋œ ํ—ˆ์šฉ ์˜ค์ฐจ๊ฐ€ ์žˆ์ง€๋งŒ ์˜คํžˆ๋ ค np.isclose () ์ž์ฒด๋กœ ์˜ค๋ฅ˜๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋” ํฐ ๋ฌธ์ œ๋Š” ๊ธฐ๋ณธ atol ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ธ์ˆ˜๊ฐ€ ์ˆœ์„œ 1์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋งค์šฐ ์ž˜๋ชป๋œ ๊ฐ€์ • ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋ฉด ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. , ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆˆ์น˜ ์ฑ„์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

In [85]: np.isclose(9.0e-9, 1.0e-9)
Out[85]: True

์•„์•ผ!

์˜ˆ, atol ์›์ธ์ž…๋‹ˆ๋‹ค.

In [86]: np.isclose(9.0e-9, 1.0e-9, atol=0.0)
Out[86]: False

๋”ฐ๋ผ์„œ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ๊ธธ์„ ๊ฐ–๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ‚ค์›Œ๋“œ ์ธ์ˆ˜ ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. __future__ ๋“ฑ์„ ์—‰๋ง์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„๋‹จ ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ  ๊ถ๊ทน์ ์œผ๋กœ ๋‹ค์šด ์ŠคํŠธ๋ฆผ ๊ธฐ๋ณธ ์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ๋ณ€๊ฒฝํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  78 ๋Œ“๊ธ€

imho๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋Šฆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ชจ๋“  numpy์—์„œ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค ( assert_allclose ). ์œ ์ผํ•œ ๊ฒฝ๋กœ๋Š” ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ˜„์žฌ ๊ตฌํ˜„์ด ๋ฒ„๊ทธ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๊ณ  ๊ณ ๋ฐฑํ•œ๋‹ค. ์ฐธ๊ณ  ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น max(abs(a), abs(b)) ๋Œ€์‹  abs(b) ๊ธฐ์กด์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ค‘๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค, ๊ทธ๊ฒƒ์€ ๋‹จ์ง€์˜ ๊ฒฝ์šฐ ๊ทธ์— ์กฐ๊ฑด์„ ์™„ํ™” abs(a) > abs(b) .

์ ์–ด๋„ ์ด๊ฒƒ์€ ๋‚ด์žฅ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” docstring์— ๊ฒฝ๊ณ ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

from numpy.__future__ import isclose

๋ง๋ถ™์—ฌ์„œ, ๊ทธ๊ฒƒ์€ ๋‚œ์ˆ˜ ๋ฒ„์ „ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ...

์„ค๋ช…์„ ์œ„ํ•ด ๊ฐ€์ ธ ์˜ค๊ธฐ๋Š” ์‹ค์ œ๋กœ isclose๋ฅผ ๊ฐ€์ ธ ์˜ค์ง€ ์•Š์ง€๋งŒ ์ƒˆ๋กœ์šด ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ชจ๋“ˆ๋กœ ํผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„์ด๋””์–ด๋Š” ์‚ฌ๋žŒ๋“ค์ด ์˜ฌ๋ฐ”๋ฅธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๋™์‹œ์— ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊นฐ ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

, ๊ฐ€์ ธ ์˜ค๊ธฐ๋Š” ์‹ค์ œ๋กœ isclose๋ฅผ ๊ฐ€์ ธ ์˜ค์ง€ ์•Š์ง€๋งŒ ์ƒˆ๋กœ์šด ์˜๋ฏธ๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์ˆ˜์ž…ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋” ๊ธด ์ด๋ฆ„์„ ์„ ํƒ mathlike_ufunc ๋‹ค๋ฃฐ ์ˆ˜์žˆ๋Š”, S remainder ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ.

from __future__ import print_function ์‹ค์ œ๋กœ print_function ์ „์—ญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ from __future__ import * ์Šคํƒ€์ผ์˜ ๊ฐ€์ ธ ์˜ค๊ธฐ๋Š” ์—ฌ๊ธฐ์— ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ์—์„œ๋Š” ํŒŒ์ผ ๋ณ„ ์ˆ˜์ค€์—์„œ _syntax_์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉฐ numpy์—์„œ ๋น„์Šทํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๊นŒ๋‹ค๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋ณต๊ธฐ ์˜ˆ์™ธ๋Š” ๊ตฌ๋ฌธ ๋ณ€๊ฒฝ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ˜ธ์ถœ ๋ชจ๋“ˆ์˜ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฒ€์‚ฌํ•˜๋ ค๋ฉด ์ž‘์€ C ๋ชจ๋“ˆ ๋งŒ ์žˆ์œผ๋ฉด๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ชจ๋“ˆ์„ ์บ์‹œํ•˜์—ฌ ๊ฐ€์ ธ ์˜ค๊ธฐ ์‹œ๊ฐ„ ๋งŒ ๋Š๋ฆฌ๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹  ๋ง์ด ๋งž๊ณ  true_division ์€ ๋ถ„๋ช…ํžˆ isclose์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด with ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  # 9444์˜ ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

math.isclose ์˜ ์ œ์ž‘์ž๋กœ @ ChrisBarker-NOAA๋ฅผ CCํ•ฉ์‹œ๋‹ค.

์ด๊ฒƒ์€ ๋งค์šฐ ์‚ฌ์†Œํ•œ ๋ฌธ์ œ IMO์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ atol ๋ฐ rtol ๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผ ๋  ๋•Œ๊นŒ์ง€ ์กฐ์ž‘ํ•˜์—ฌ ์„ ํƒํ•˜๋ฉฐ, ๋ชฉํ‘œ๋Š” ํ—ˆ์šฉ ์˜ค์ฐจ๋ณด๋‹ค ํ›จ์”ฌ ํฐ ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. @charris๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ์ฒ˜๋Ÿผ rtol ๋ถ€๋ถ„์„ โ€‹โ€‹์™„ํ™”ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์  ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ,์ด ์ž‘์€ ์กฐ์ •์„ ์œ„ํ•ด ์Šคํƒ ๋‚ด๋ถ€ ๊ฒ€์‚ฌ ํŠธ๋ฆญ์„ ๋Œ์–ด๋‚ผ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” isclose ๊ฐ€ ์ข…์ข… assert_allclose ๋˜๋Š” ๋‹ค์–‘ํ•œ ํƒ€์‚ฌ ํ…Œ์ŠคํŠธ ๋„์šฐ๋ฏธ์— ์˜ํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

__future__ ์Šคํƒ€์ผ ๊ฐ€์ ธ ์˜ค๊ธฐ ์‚ฌ์šฉ์— ๋Œ€ํ•ด StackOverflow์— ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค. https://stackoverflow.com/questions/29905278/using-future-style-imports-for-module-specific-features-in-python

TLDR : ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์‰ฝ๊ฑฐ๋‚˜ ๊นจ๋—ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์Šคํƒ ์ธํŠธ๋กœ ์ŠคํŽ™ ์…˜์€์ด๋ฅผ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ธฐ์œ„ํ•œ ์ผ๋ฐ˜์ ์ธ ์ •์ฑ…์œผ๋กœ ์ œ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์›์น™์ ์œผ๋กœ ์ด๊ฒƒ์ด ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€์ž…๋‹ˆ๋‹ค. ๋Œ€๋‹ต์ด '์˜ˆ'๋ผ๋ฉด ๊ด‘๋ฒ”์œ„ํ•œ ์‚ฌ์šฉ์„ ๊ฐ์•ˆํ•  ๋•Œ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ธฐ๊ฐ„์€ ์ตœ์†Œํ•œ ๋ช‡ ๋…„์ด๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Python์€ ๊ณผ๊ฑฐ ๋ชจ๋“ˆ์„ ํฌํ•จํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์ˆ˜์š”๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ API ์•ˆ์ •์„ฑ์„ ๊ฐœ์„ ํ•˜๊ธฐ์œ„ํ•œ ํ•˜๋‚˜์˜ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ isclose(...,symmetric=True) ๋˜๋Š” assert_allclose(symmetric=True) ์˜ต์…˜์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ธฐ๋ณธ๊ฐ’์€ ํ˜„์žฌ ์ƒํ™ฉ ์ธ False ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด rtol ๋ฐ atol ๊ฐ’์— ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•˜์ง€ ์•Š์„ ๋•Œ ์‚ฌ์†Œํ•œ ๋ฌธ์ œ๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. @njsmith๊ฐ€ ์–ธ๊ธ‰ ํ•œ๋Œ€๋กœ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋„๋ก ์กฐ์ •ํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋•Œ๋กœ๋Š” ์˜ค๋ฅ˜๊ฐ€ 1 % ( rtol=0.01 ) ๋‚ด์— ์žˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๊ฒฝ์šฐ rtol ์ธก์ •์— ๊ด€ํ•œ ์ตœ์•…์˜ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋Š” 100 %์ž…๋‹ˆ๋‹ค ( rtol * abs(b) ๊ฐ€ atol ๊ฐ€๊นŒ์›Œ์ง€๋ฉด atol + rtol * abs(b) ~= 2 * rtol * abs(b) ).

์ผ๋ถ€ ๊ฐ’์€ ~ 2 % ์˜ค๋ฅ˜๋กœ ํ†ต๊ณผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

atol = 1e-8 #default
rtol = 0.01 # 1%

b = 1e-6
a = 1.0199e-6 # ~ 2% larger comapared to b
abs(a - b) <= (atol + rtol * abs(b))
True

@charris ์˜ ์•„์ด๋””์–ด๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด์ด ํŠน์ • ๊ฒฝ์šฐ๊ฐ€ ๋งค์šฐ ์•ฝ๊ฐ„ ๋” ๋‚˜๋น ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๊ต๋ฅผ ํ›จ์”ฌ ๋” ์™„ํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋Œ€์นญ ๋ฌธ์ œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์‹ค์ œ๋กœ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋ฏ€๋กœ ์—ฌ์ „ํžˆ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

IMO๋Š” Numpy๊ฐ€ Math ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ๊ฒƒ์ด์ง€๋งŒ, ๋ณ€๊ฒฝ์ด ๋„ˆ๋ฌด ํŒŒ๊ดด์ ์ด๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. isclose ์ฝ”์–ด๊ฐ„์— ๋ณ€๊ฒฝํ•˜๋Š” ์˜ต์…˜์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

@njsmith : ๋ฐ๋ ค์™€ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์•ฝ๊ฐ„์˜ ์—ญ์‚ฌ : ๋‚ด๊ฐ€ stdlib์— ๋Œ€ํ•ด isclose๋ฅผ ์ œ์•ˆํ–ˆ์„ ๋•Œ ์šฐ๋ฆฌ๋Š” ํ™•์‹คํžˆ numpy๋ฅผ ์„ ํ–‰ ๊ธฐ์ˆ ๋กœ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋งŒ ์žˆ์—ˆ๋‹ค๋ฉด ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :-).

ํ•˜์ง€๋งŒ ๋‚˜๋จธ์ง€ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ƒ๊ฐ์€ ํŒŒ์ด์ฌ์— "์˜ฌ๋ฐ”๋ฅธ"์ผ์„ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธด ํ† ๋ก ์ด ์ด์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ €๋Š” PEP์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ์š”์ ์„ ํฌ์ฐฉํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ numpy์— ๋Œ€ํ•œ ์ฐธ์กฐ์ž…๋‹ˆ๋‹ค.

https://www.python.org/dev/peps/pep-0485/#numpy -isclose

์ด ํ† ๋ก ์—์„œ์™€ ๋™์ผํ•œ ์š”์ ์ด ๋งŒ๋“ค์–ด ์กŒ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ์‚ฌํ•ญ์ด ๋‚˜์™”์Šต๋‹ˆ๋‹ค.

1) ๋Œ€์นญ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ตœ์†Œํ•œ์˜ ๋†€๋ผ์›€์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค.

2) ์ธ์ˆ˜์˜ ํฌ๊ธฐ์— ๋Œ€ํ•œ ๊ฐ€์ •์„ํ•˜์ง€ ์•Š๋„๋ก ๊ธฐ๋ณธ ์ ˆ๋Œ€ ํ—ˆ์šฉ ์˜ค์ฐจ๋Š” ์•„๋งˆ๋„ 0์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

3) "์•ฝํ•œ"ํ…Œ์ŠคํŠธ์™€ "๊ฐ•ํ•œ"ํ…Œ์ŠคํŠธ์˜ ์ฐจ์ด๋Š” ์˜ˆ์ƒ๋˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž‘์€ ํ—ˆ์šฉ ์˜ค์ฐจ๋กœ ์‚ฌ์šฉ๋  ๋•Œ ๋ฌด๊ด€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์šฐ๋ฆฌ๊ฐ€ math.isclose๋ฅผ์œ„ํ•œ "์ตœ๊ณ ์˜"์†”๋ฃจ์…˜์„ ์ƒ๊ฐํ•ด ๋ƒˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ๊ธฐ์— ์ถฉ๋ถ„ํ• ๋งŒํผ "๋” ๋‚˜์€"๊ฐ€์š”? ๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ๋งŽ์€ numpy (๋ฐ python)์—๋Š” ์œ ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์ง€๋งŒ ํ˜„์žฌ ๋…ผ์˜๊ฐ€ ๋งŽ์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์— ๋Œ€ํ•ด ๋งŽ์€ ์ฐจ์„ ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ Š์€ ๋„์„œ๊ด€์— ์˜ˆ์ƒ๋˜๋Š” (ํ•„์š”ํ•œ) ๊ฒƒ์ด๋ฉฐ, ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ ๊ทธ๊ฒƒ๊ณผ ํ•จ๊ป˜ ์‚ด์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

@njsmith ๊ฐ€ ๋งž์Šต๋‹ˆ๋‹ค-np.isclose ()์˜ ์‚ฌ์šฉ์€ ์—„๊ฒฉํ•œ FP ์˜ค๋ฅ˜ ๋ถ„์„์— ์˜ํ•ด ์„ค์ •๋œ ํ—ˆ์šฉ ์˜ค์ฐจ๊ฐ€ ์žˆ์ง€๋งŒ ์˜คํžˆ๋ ค np.isclose () ์ž์ฒด๋กœ ์˜ค๋ฅ˜๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋” ํฐ ๋ฌธ์ œ๋Š” ๊ธฐ๋ณธ atol ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ธ์ˆ˜๊ฐ€ ์ˆœ์„œ 1์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋งค์šฐ ์ž˜๋ชป๋œ ๊ฐ€์ • ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋ฉด ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. , ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆˆ์น˜ ์ฑ„์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

In [85]: np.isclose(9.0e-9, 1.0e-9)
Out[85]: True

์•„์•ผ!

์˜ˆ, atol ์›์ธ์ž…๋‹ˆ๋‹ค.

In [86]: np.isclose(9.0e-9, 1.0e-9, atol=0.0)
Out[86]: False

๋”ฐ๋ผ์„œ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ๊ธธ์„ ๊ฐ–๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ‚ค์›Œ๋“œ ์ธ์ˆ˜ ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. __future__ ๋“ฑ์„ ์—‰๋ง์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„๋‹จ ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ  ๊ถ๊ทน์ ์œผ๋กœ ๋‹ค์šด ์ŠคํŠธ๋ฆผ ๊ธฐ๋ณธ ์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ๋ณ€๊ฒฝํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@bashtage ์˜ ์ œ์•ˆ์„ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

"" "
๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€์ด ์˜ต์…˜์„ isclose (..., symmetric = True) ๋˜๋Š” assert_allclose (symmetric = True) ์˜ต์…˜์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ธฐ๋ณธ๊ฐ’์€ ํ˜„์žฌ ์ƒํ™ฉ ์ธ False์ž…๋‹ˆ๋‹ค.
"" "

์ƒˆ ํ•จ์ˆ˜ ์ด๋ฆ„๋ณด๋‹ค ๋” ๋‚˜์€ ์˜ต์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ํ–ฅํ›„ ์‚ฌ์šฉ ์ค‘๋‹จ ๋ฐ ๊ธฐ๋ณธ๊ฐ’ ๋ณ€๊ฒฝ (๋˜๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Œ)์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(๊ฐ•๋ ฅํ•œ) ๋Œ€์นญ ํ…Œ์ŠคํŠธ ์™ธ์—๋„ atol ๊ธฐ๋ณธ์ ์œผ๋กœ 0์œผ๋กœ ์„ค์ •๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ, ๋‚˜์˜์ง€๋Š” ์•Š์ง€๋งŒ symmetric ๋ณด๋‹ค ๋” ๋‚˜์€ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„-๊ทธ๋ฆฌ๊ณ  assert allclose() ์™ธ์—๋„ numpy์˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ isclose() ๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ์ง€์› ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ์ž…๋ ฅํ•˜๊ณ 
๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „์— ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค. ์šฐ๋ฆฌ๋Š” ๊ณ„์†ํ•ด์„œ
๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜๋ผ๋Š” ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ 
๋Œ€์นญ = ๊ฑฐ์ง“; ๊ธฐ๋ณธ๊ฐ’์ด๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ๋งํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๊ฒฝ๊ณ ๊ฐ€ ์žˆ์–ด๋„ ๊ณง ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

assert_allclose ์—๋„ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ์กฐ์šฉํžˆ ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์‚ฌ๋žŒ๋“ค์ด ๊ฒฝ๊ณ ๋ฅผ ์—†์• ๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋„๋กํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉ ์˜ค์ฐจ ๊ฐ์†Œ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋„๋กํ•˜๋Š” ๊ฒƒ๊ณผ ์‹ค์ œ๋กœ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@xoviat @ eric-wieser assert_allclose ๋Œ€ํ•œ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋„์žˆ์„ ์ˆ˜ ์—†์œผ๋ฉฐ, ๋„ˆ๋ฌด ์ง€์žฅ์„์ฃผ๋Š” ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ๋„ ์—†์Šต๋‹ˆ๋‹ค. ์ง€์› ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œ ํ•  ์œ„์น˜๋ฅผ ๋†“์นœ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด?

์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ทน์†Œ์ˆ˜์— ๋Œ€ํ•œ ๋งŽ์€ ๊ณ ํ†ต์ฒ˜๋Ÿผ ๋“ค๋ฆด ๊นŒ๋ด ๋‘๋ ค์›Œ
๋‚˜์—๊ฒŒ ์ด๋“.

๊ธฐ๋ณธ์ ์œผ๋กœ atol์ด 0์ด ์•„๋‹Œ ๊ฒƒ์€ ์šฐ์—ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์–ป๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค
์˜ˆ์ƒ ๊ฒฐ๊ณผ์— ๋‹ค์Œ์ด ํฌํ•จ ๋œ ๋ชจ๋“  ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ํ•ฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ ๋™์ž‘
์ •ํ™•ํ•œ 0.

assert_allclose์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‚ด๋ถ€์ ์œผ๋กœ ์ด์ „ ๋™์ž‘์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

IMO์˜ ์กฐ์šฉํ•œ ๋ณ€๊ฒฝ์€ ๋”์ฐํ•ฉ๋‹ˆ๋‹ค! ์ง€์› ์ค‘๋‹จ ๊ฒฝ๊ณ ๋Š”
์‚ฌ๋žŒ๋“ค์€ ๊ฒฐ๊ตญ ๋Œ€ํ™” ํ˜• ํ”„๋กฌํ”„ํŠธ์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ž…๋ ฅ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์ƒˆ๋กœ์šด ํ–‰๋™์„ ์–ป์œผ์‹ญ์‹œ์˜ค.

IMO์˜ ์กฐ์šฉํ•œ ๋ณ€๊ฒฝ์€ ๋”์ฐํ•ฉ๋‹ˆ๋‹ค!

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜์˜ ์ง€์› ์ค‘๋‹จ ๊ฒฝ๊ณ ๋Š” ์‚ฌ์šฉ์ž (์ ์–ด๋„ ์‹ค์ œ๋กœ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์‚ฌ์šฉ์ž)๊ฐ€ ๋ณ€๊ฒฝํ•˜๋„๋ก ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค.

@charris๊ฐ€ ์ œ์•ˆํ•œ ์–ด๋–ป ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ๋˜ํ•œ atol != 0.0 ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” ๋‚˜์œ ์ผ๋“ค์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋กœ ์ฑ„์›Œ์งˆ ์ˆ˜์žˆ๋Š” ๋ฌธ์„œ ๊ณต๊ฐ„์„ ํ™•๋ณด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์•Œ๋ฆฌ์ง€ ์•Š๊ณ ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
ํ–‰๋™. ๋‚ด๊ฐ€ ๊ทธ ๋ฐฉ๋ฒ•์„ ์•„๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๊ฒฝ๊ณ ์ž…๋‹ˆ๋‹ค.

์ •๋ง ์ข‹์€ ๊ฒƒ์€ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ์ž๋™ํ™” ๋œ ๋ฆฌํŒฉํ† ๋ง ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
์ด์ „ ์ฝ”๋“œ๋กœ. ๊ทธ๋Ÿฐ ๋‹ค์Œ '์œ ์ง€ ๊ด€๋ฆฌ'๋Š” ์‚ฌ์šฉ์ž์˜
์•”ํ˜ธ; 5 ๋ถ„์˜ ์ž‘์—….

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ํ”Œ๋ž˜๊ทธ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@charris๊ฐ€ ์ œ์•ˆํ•œ ์–ด๋–ป ์Šต๋‹ˆ๊นŒ?

๊ทธ ์ œ์•ˆ (https://github.com/numpy/numpy/issues/10161#issuecomment-349384830)์ด ๊ฐ€๋Šฅํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ณ€๊ฒฝ๋œ ํ–‰๋™์— ๋Œ€ํ•ด ์•Œ๋ฆฌ์ง€ ์•Š๊ณ ๋Š”์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๊ณ ์น˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜๋ฏธ ๋ก ์  ๋ฒ„์ „ ๋ฌธ์ œ์—์„œ ๋ฐฉ๊ธˆ ๋…ผ์˜ ๋œ ๋ชจ๋“  ๋ณ€๊ฒฝ์˜ ๋น„์šฉ / ํŽธ์ต์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ์—์„œ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๊ฒฝ๊ณ ๋ฅผ ๋ฐœํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ๋™์ž‘์€ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค (์•„๋งˆ๋„ ์ฐจ์„ ์ฑ… ์ผ ์ˆ˜ ์žˆ์Œ).

๋ช…ํ™•ํ•˜๊ฒŒ ๋งํ•˜๋ฉด isclose์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์„ ์ œ์•ˆํ–ˆ์ง€๋งŒ assert_allclose๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
์ถœ์ฒ˜๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๊ทธ ๋ณ€ํ™”๋Š” ํŒŒ๊ดด์  ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ด์ ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋„ˆ๋ฌด ์ž‘์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„๋ฌด๋„ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค
๊ทธ๋ž˜๋„ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฐ์ฒด, ๋งž์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์•„๋ฌด๋„ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ?

ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. @charris ์˜ ์ œ์•ˆ์—๋Š” ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ์ด๋ฅผ ๋„์ž…ํ•˜๋Š” ํ”Œ๋ž˜๊ทธ๋Š” ๋ฐฐ์—ด์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ์˜๋ฌธ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

In [1]: import math

In [2]: math.isclose(0, 1e-200)
Out[2]: False

๊ตฌ์ฒด์ ์ธ ๋™๊ธฐ์™€ ์‚ฌ์šฉ ์‚ฌ๋ก€์—†์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ์œ ์šฉํ•œ ๋ฆฌํŠธ๋จธ์Šค ํ…Œ์ŠคํŠธ : ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๊ฐ€์ด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์กด์žฌํ•˜๋Š” ์ด์œ ๋ฅผ ๋ฌป๋Š”๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์„ค๋ช… ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์–ด๋–ป๊ฒŒ ์„ค๋ช… ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

  1. math.isclose ํ˜ธ์ถœ์„ ๋ฒกํ„ฐํ™”ํ•˜๋ ค๋ฉด symmetric=True ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊นจ์ง€ ์•Š๋„๋ก ํ”Œ๋ž˜๊ทธ ์—ฌ์•ผํ–ˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ์ƒํ™ฉ์„ ๋” ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ ์—ฌ๊ธฐ์„œ ํ•ด๊ฒฐ๋˜๋Š” ์œ ์ผํ•œ ๋ฌธ์ œ๋Š” ์ดˆ๋ณด์ž๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋ถ€๋™ ์†Œ์ˆ˜์  ์ •ํ™•๋„์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค. @rgommers์˜ ์˜ˆ๋Š”
์ž˜๋ชป๋œ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ •๋ง ์ž‘์€
๋ฒˆํ˜ธ? IMO๋Š” math.isclose ๊ตฌํ˜„์ด ๋” ๋‚ซ์ง€ ๋งŒ
๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ํ•ฉ์˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์‹ค์ œ๋กœ
์ˆซ์ž๊ฐ€ "๊ฐ€๊นŒ์šด"์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ์œ„ํ•œ ๋‹จ์ผ ํฌ๊ธฐ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜
๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์‘๋‹ต์„ ๊ธฐ๋ฐ˜์œผ๋กœ (ํ‹€๋ฆฐ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค!), ์ •๋ง
์•ž์œผ๋กœ API์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ณ€๊ฒฝ. ์ทจํ•  ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ์กฐ์น˜๋Š”
์•„๋งˆ๋„ ๋ฌธ์„œ ์—…๋ฐ์ดํŠธ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด์ „์— ๊นƒ๋ฐœ์ด ๊ดœ์ฐฎ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ ํ–ˆ์Šต๋‹ˆ๊นŒ?)

ํ™•์‹คํžˆ math.isclose ์™€ ๋น„๊ตํ•˜๊ณ  ์›ํ•˜๋Š” ๊ฒฝ์šฐ rtol ๋ฐ atol์„ ์„ค์ •ํ•˜์—ฌ ๋™์ผํ•œ ๋ฒกํ„ฐ ๋™์ž‘์„ ์–ป๋Š” ๋ฐฉ๋ฒ•์„ ๋ฌธ์„œํ™”ํ•˜๋Š” ๋ฉ”๋ชจ๋Š” ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด @charris ๋Š”
ํ˜„์žฌ๋ณด๋‹ค ๋œ ๊ด€๋Œ€ํ•˜๋‹ค.
๋ชจ๋“  ํ…Œ์ŠคํŠธ. ๋‚˜๋Š” ์•„์ง๋„ํ•ฉ๋‹ˆ๋‹ค (์ด ๊ฒฝ๊ณ ๋ฅผ ๋ฐฉ์ถœ ํ•  ์ˆ˜์žˆ๋Š” ์ข‹์€ ์•„์ด๋””์–ด๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ
๊ฒฝ๊ณ ๋Š” ํ•œ ๋ฒˆ๋งŒ ๋ฐœ์ƒํ•ด์•ผ ํ•จ) isclose๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์ด์žˆ๋Š” ๊ฒฝ์šฐ
์ด์ „์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์•˜์„ ๋•Œ ์ˆซ์ž๋ฅผ "๊ฐ€๊นŒ์šด"๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋งŽ์ด๋™์ž‘๋ณด๋‹ค ์กฐ์šฉํžˆํ•˜์ง€์‹œํ‚ค๋Š”
์˜ํ–ฅ์„๋ฐ›์„ ๋•Œ ๋ˆ„๊ตฌ๋‚˜ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์˜ ์„ค๋ช…์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. math.isclose ๋‹ค๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • atol ๋Œ€ํ•œ ๋‹ค๋ฅธ ๊ธฐ๋ณธ๊ฐ’
  • rtol ์˜ ๋‹ค๋ฅธ ์ •์˜

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ์— ๋Œ€ํ•ด`math.isclose์™€ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋ฌธ์„œํ™”ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ๋Š” ๊ธฐ๋ณธ๊ฐ’์ด False symmetric ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋ฌธ์„œ์— ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. _ " np.isclose(x, y, symmetric=True, atol=0) ๋Š” math.isclose(x, y) "_์˜ ๋ฒกํ„ฐํ™” ๋œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์ €์—๊ฒŒ๋Š” ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ํ•ด๊ฒฐํ•˜๋ ค๊ณ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์„ธ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ถ”๊ฐ€ ์ธ์ˆ˜๋ฅผ ๋ฌธ์„œํ™”ํ•˜๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์€ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. ์ธ์ˆ˜์—†์ด isclose ํ˜ธ์ถœ์„ ์ค‘๋‹จํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฝ๊ณ ์—†์ด ์ด์ „ ๋™์ž‘์„ ๊ฐ€์ ธ ์˜ค๋„๋ก isclose(..., symmetric=False) ๋ฅผ ์ž‘์„ฑํ•˜๋„๋กํ•ฉ๋‹ˆ๋‹ค ( allclose ์™€ ์œ ์‚ฌ ํ•จ). ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋„ˆ๋ฌด ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์น˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๊ทธ ๊ฒฐ๊ณผ๋Š” ํฐ ์ด๋“์„ ์–ป์ง€ ๋ชปํ•˜์—ฌ ์ฝ๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. assert_close ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ isclose(..., symmetric=False) ๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ ํ•ด๋‹น ์‚ฌ์šฉ์ž๋Š” ์˜ํ–ฅ์„๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  3. ์œ„์™€ ๋น„์Šทํ•˜์ง€๋งŒ assert_close symmetric ์ธ์ˆ˜๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค์šด ์ŠคํŠธ๋ฆผ์—์„œ ์—„์ฒญ๋‚œ ์ดํƒˆ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  4. ๋™์ž‘์„ ์กฐ์šฉํžˆ ๋ณ€๊ฒฝ

์ด ์ค‘ 1 ๋ฒˆ ์˜ต์…˜์€ ๋ฐ˜๋Œ€ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋‚˜๋จธ์ง€๋Š” ์ค‘๋‹จ ํ• ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ : 2๋Š” ๋™์ž‘์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ํ—ˆ์šฉ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ›จ์”ฌ ๋œ ์‹œ๋„ ๋Ÿฝ์Šต๋‹ˆ๋‹ค.

@ eric-wieser ์„ธ ๋ฒˆ์งธ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. atol ์™€ rtol ๊ฐ€ ๊ฒฐํ•ฉ๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ( math.isclose ๋Š” max , numpy.isclose ๋Š” + ). ์ฆ‰, atol ๋˜๋Š” rtol ๊ฐ€ 0์ด ์•„๋‹Œ ๊ฒฝ์šฐ math.isclose ํ˜ธ์ถœ์„ numpy.isclose ํ˜ธ์ถœ๊ณผ ์ผ์น˜์‹œํ‚ค๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” API๋ฅผ ์ถ”๊ฐ€ ํ•  ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์˜ต์…˜ 2๋ฅผ ์„ ํ˜ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๊ทธ ์˜ต์…˜์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.
numpy๊ฐ€ ์ž๋™์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ์ถ”๊ฐ€ ๊ทœ์ •
๋ฆฌํŒฉํ† ๋ง ๋„๊ตฌ (entry_points์— ์ถ”๊ฐ€๋จ)๋Š”
๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ๋ง์— ๋”ฐ๋ฅด๋ฉด
์ด ์˜ต์…˜์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์„ ํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉฐ 3 ๋ฒˆ์ด๋‚˜ 4 ๋ฒˆ ์˜ต์…˜์— ์ฐฌ์„ฑ ํ•œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ์—
๋˜ํ•œ ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋Šฅ ๋™์ž‘ ๋ณ€๊ฒฝ์„ ์„ ํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
4 ๊ฐœ ์ด์ƒ์˜ ์ฃผ์š” ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•ด ๋ฐฉ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด (๊ทธ๋“ค์ด ๊ฐ€์ง€๊ณ ์žˆ๋Š”) ์˜ต์…˜ 2์— ๋™์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด, ๋‚˜๋Š”
์˜ต์…˜ 1์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค (ํŠนํžˆ @njsmith)์€ ์„ ํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์—์„œ ์ œ๊ณต ํ•œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ ๊ทธ๊ฒƒ์€ ๋‚ด ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

@njsmith ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๋กœ ํ•จ์ˆ˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ธ ๋ฒˆ์งธ ์ฐจ์ด๋ฅผ ํ•ธ๋“œ ์›จ์ด๋ธŒ๋กœ ์ ‘์–ด _ "rtol์€ ๋‹ค๋ฅด๋‹ค"_

"" "
์‹ค์ œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ์ƒํ™ฉ์„ ๋” ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
"" "
๋„๋„›์— ๋ˆ์„ ๊ฑธ๊ฒ ์Šต๋‹ˆ๋‹ค. (์ด๊ฒŒ ๋ฌด์Šจ ๋œป์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.) atol์ด ํ…Œ์ŠคํŠธ๋ฅผ ํ›จ์”ฌ ๋œ ๋ฏผ๊ฐํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ํ†ต๊ณผํ•ด์„œ๋Š” ์•ˆ๋˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ตฌํ˜„์—๋Š” ์„ธ ๊ฐ€์ง€ "๋ฌธ์ œ"๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1) ๋Œ€์นญ์ด ์•„๋‹™๋‹ˆ๋‹ค.

  • ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋„ˆ๋ฌด ๋‚˜์˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ํฐ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ๋ฉฐ ๊ฐ’์ด ์‹ค์ œ๋กœ ๊ฐ€๊นŒ์šธ ๋•Œ ๊ฑฐ์˜ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค :-) ๋‚˜๋Š” _think_ rtol <1e-8 (์ ์–ด๋„ atol์ด 0.0์ด๋ฉด)์ด๋ฉด ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

2) atol์€ 0๊ณผ ๋น„๊ตํ•  ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ์—๋„ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค (ํ”ผํ•  ์ˆ˜ ์—†์Œ).ํ•˜์ง€๋งŒ ์•ฝ 2 ๋ฐฐ ์ •๋„์˜ ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” atol์ด ํฌ๋ฉด ํ›จ์”ฌ ๋” ๋งŽ์€ ์–‘์œผ๋กœ ์ž‘์—… ํ•  ๊ฒฝ์šฐ ๊ทธ๋Ÿด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํฌ๊ธฐ ๊ฐ’.

3) atol์€ 0์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค .-- ์‹ค์ œ๋กœ ์ด๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (ํŠนํžˆ ๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ์ถ”๊ฐ€ํ•˜๋Š” ํ˜„์žฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ) ์•ˆ๋˜๋Š” ํ…Œ์ŠคํŠธ ํ†ต๊ณผ๋กœ ์‰ฝ๊ฒŒ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•ฝ๊ฐ„ ๊ฒŒ์œผ๋ฅด๋‹ค-์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ ํ—ˆ์šฉ ์˜ค์ฐจ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ํ†ต๊ณผํ•˜๋ฉด ๋๋‚ฌ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์„ ๋•Œ, ๋‚˜๋Š” y ์ฝ”๋“œ๋กœ ๋Œ์•„๊ฐ€์„œ ๊ทธ ์ค‘ ๋ช‡ ๊ฐœ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค-์›์Šค!

์ด ์Šค๋ ˆ๋“œ์˜ ๋ˆ„๊ตฐ๊ฐ€๋Š” "๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ๋ญ”๊ฐ€ ์งœ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

isclose (1e-200, 0.0)

๊ธฐ๋ณธ์ ์œผ๋กœ False๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค-์˜ˆ, ๋†€๋ž์ง€ ๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ƒ๊ฐํ•˜๋„๋ก ๊ฐ•์š”ํ•˜๋Š” ๋ฐ˜๋ฉด ํ˜„์žฌ ๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋‚ณ์Šต๋‹ˆ๋‹ค.

[8]์—์„œ : np.isclose (1e-20, 1e-10)
์ถœ๋ ฅ [8] : ์ฐธ

์ •๋ง? ํ•˜๋‚˜๋Š” MAGNITUDE์˜ TEN ORDERS๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ํฌ๊ณ  ๋‹ค์‹œ True ????

๋‚ด ์š”์ ์€ atol์ด 0์ด ์•„๋‹ˆ๋ฉด 0๊ณผ ๋น„๊ตํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์—๋Š” ๋œ ๋†€๋ผ์šด ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ์ž‘์€ ์ˆซ์ž๋กœ ์ž‘์—… ํ•  ๋•Œ ํ›จ์”ฌ ๋” ์œ„ํ—˜ํ•˜๊ณ  ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (์ž‘์€ ์‹ค์ œ๋กœ๋Š” ํฌ๊ธฐ 1๋ณด๋‹ค ์ž‘์€ ๊ฒƒ์ž„).

๊ทธ๋ฆฌ๊ณ  1e8๋ณด๋‹ค ํฐ ์ˆซ์ž๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ atol๋„ ๋ถ€์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  (2)์™€ ๊ฒฐํ•ฉํ•˜๋ฉด ๊ธฐ๋ณธ atol์ด ๋†€๋ผ์šด ๋ฐฉ์‹์œผ๋กœ ์ƒ๋Œ€ ํ—ˆ์šฉ ์˜ค์ฐจ ํ…Œ์ŠคํŠธ๋ฅผ ๋ง์น  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ : ์•„๋‹ˆ์˜ค, ๊ทธ๊ฒƒ์€ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ฉฐ "๊นจ์ง„"๊ฒƒ๋„ ์•„๋‹ˆ์ง€๋งŒ ๊ฝค ์ฐจ์„ ์ฑ…์ด๋ฏ€๋กœ ๋” ๋‚˜์€ ๊ตฌํ˜„์œผ๋กœ ๋‚˜์•„๊ฐˆ ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ”Œ๋ž˜๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ข‹์•„ํ–ˆ์ง€๋งŒ ๋งˆ์Œ์ด ๋ฐ”๋€Œ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์–ด๋Š ์‹œ์ ์—์„œ ๊ธฐ๋ณธ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ํ•œ ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด "์ด์ „"์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฑฐ์˜ ์˜์›ํžˆ. ๊ทธ๋ฆฌ๊ณ  ์™œ ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ๋น„๋‚œ ํ•  ์ˆ˜ ์—†๋Š”์ง€์— ๋Œ€ํ•œ ๋งŽ์€ ์ข‹์€ ์ฃผ์žฅ์ด์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์•„๋งˆ๋„ ์ƒˆ๋กœ์šด ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ƒˆ๋กœ์šด ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์žฅ๋ คํ•˜๋Š” ๋ฌธ์„œ์— ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๊ณ , ์‚ฌ๋žŒ๋“ค์ด ์ƒˆ๋กœ์šด ๊ฒƒ์„ ์‚ฌ์šฉํ•  ๋•Œ ์–ด๋–ค ์‹œ์ ์—์„œ ๊ฒฝ๊ณ ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ๋ˆ„๊ตฌ์˜ ์ฝ”๋“œ๋„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋‚˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์˜ ์ข‹์€ ์ด๋ฆ„์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ ????

์–ด์ฉŒ๋ฉด np.math.isclose์™€ ์นœ๊ตฌ๋“ค? ๋ชจ๋ฅด๊ฒ ์–ด์š”.

๊ทธ๋Ÿฌ๋ฉด np.remainder ์ฐจ์ด๋„ ํ•ด๊ฒฐ๋˜๊ณ  from numpy import math ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ๋ฒกํ„ฐํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” np.math ๋ชจ๋“ˆ์—์„œ +1 ๋ฉ๋‹ˆ๋‹ค.

10 ๋…„ ๋™์•ˆ ๊ทธ๋ ‡๊ฒŒ ์ž‘๋™ํ–ˆ๋˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๊ณผ ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋™์ž‘์„ ๊ฐ€์ง„ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งค์šฐ ์ข‹์ง€ ์•Š์€ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ฌธ์„œ๋กœ ์ ์ ˆํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜์—†๋Š” ๋ฌธ์ œ๋Š” ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์—์„œ -1. ๊ทธ๋ฆฌ๊ณ  ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์„œ๋ธŒ ๋ชจ๋“ˆ์—์„œ๋Š” ํ™•์‹คํžˆ -1์ž…๋‹ˆ๋‹ค.

์ •๋ง? ํ•˜๋‚˜๋Š” MAGNITUDE์˜ TEN ORDERS๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ํฌ๊ณ  ๋‹ค์‹œ True ????

๋‹น์‹ ์˜ ๊ธฐ๋Œ€๊ฐ€ ์ฐธ์ธ์ง€ ๊ฑฐ์ง“์ธ์ง€๋Š” ์ „์ ์œผ๋กœ ๋ฌธ๋งฅ์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด [0, 1)์˜ ์—ฐ์† ๋ถ„ํฌ์—์„œ ๋‚˜์˜จ ์ˆซ์ž์— ๋Œ€ํ•œ ๊ฒƒ์ด๋ผ๋ฉด ์˜ˆ, ์•„๋งˆ๋„ True๋ฅผ ๊ธฐ๋Œ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ ˆ๋Œ€ / ์ƒ๋Œ€ ํ—ˆ์šฉ ์˜ค์ฐจ์™€ ํ•จ์ˆ˜๊ฐ€ ์‹ค์ œ๋กœํ•˜๋Š” ์ผ์„ ์ดํ•ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ๋ฌธ์„œ์˜ ๋ชฉ์ ์ž…๋‹ˆ๋‹ค.

symmetric_isclose() ์€ (๋Š”) ์•ฝ๊ฐ„ ์žฅํ™ฉํ•˜์ง€๋งŒ ์ œ ๋ˆˆ์—๋Š” ๋ถˆ์พŒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.: bikeshed : ๊ทธ๋ฆผ ์ด๋ชจํ‹ฐ์ฝ˜>

2017 ๋…„ 12 ์›” 10 ์ผ ์˜คํ›„ 8:09์— Ralf Gommers [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋™์ž‘๊ณผ ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋™์ž‘์œผ๋กœ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.
10 ๋…„ ๋™์•ˆ ๊ทธ๋ ‡๊ฒŒ ์ž‘๋™ํ–ˆ๋˜ ๊ธฐ๋Šฅ์€ ์ผ๋ฐ˜์ ์œผ๋กœ
์ƒ๊ฐ.

๋‚˜๋„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์‚ฌ๋žŒ๋“ค์˜ ์ฝ”๋“œ๋ฅผ ๊นจ๋Š” ๊ฒƒ์€ ๋” ๋‚˜์ฉ๋‹ˆ๋‹ค.
numpy๋ฅผ ๊ฐœ์„ ํ•˜์ง€ ์•Š๋Š” ๋‹จ์ˆœํ•œ ๊ฒƒ ์™ธ์— ๋‹ค๋ฅธ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๊ฒฝ์šฐ ์ œ๋Œ€๋กœ ๋  ์ˆ˜์—†๋Š” ๋ฌธ์ œ๋Š” ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋ฌธ์„œ๋กœ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์กฐ์ •ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋Œ€์นญ ๋น„๊ต.

๊ทธ๋ฆฌ๊ณ  ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์„œ๋ธŒ ๋ชจ๋“ˆ์—์„œ๋Š” ํ™•์‹คํžˆ -1์ž…๋‹ˆ๋‹ค.

๋‚˜๋„. numpy์—†์ด ์ˆ˜ํ•™ ๋ชจ๋“ˆ์— ๋‹ค๋ฅธ ๊ฒƒ์ด์žˆ๋Š” ๊ฒฝ์šฐ
์œ ์šฉํ•œ ๋“ฑ๊ฐ€๋ฌผ์€ numpy์˜ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์ฒ˜๋Ÿผ.

์ •๋ง? ํ•˜๋‚˜๋Š” MAGNITUDE์˜ TEN ORDERS๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ํฝ๋‹ˆ๋‹ค.
์ง„์‹ค????

๋‹น์‹ ์˜ ๊ธฐ๋Œ€๊ฐ€ ์ฐธ์ธ์ง€ ๊ฑฐ์ง“์ธ์ง€๋Š” ์ „์ ์œผ๋กœ ๋ฌธ๋งฅ์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ”๋กœ ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— atol์— "ํ•ฉ๋ฆฌ์ ์ธ"๊ธฐ๋ณธ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค.

[0, 1)์˜ ์—ฐ์† ๋ถ„ํฌ์—์„œ ๋‚˜์˜จ ์ˆซ์ž์— ๋Œ€ํ•œ ๊ฒฝ์šฐ
์˜ˆ, ์•„๋งˆ๋„ True๋ฅผ ๊ธฐ๋Œ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ isclose๋Š” ์ƒ๋Œ€์ ์ธ ๋น„๊ต๋กœ ๊ด‘๊ณ ๋ฉ๋‹ˆ๋‹ค.
์ƒ๋Œ€์„ฑ์€ ์™„์ „ํžˆ ์‚ฌ๋ผ์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ํ•„์š”์—†์ด.

๊ทธ๊ฒŒ ๋‚ด ์š”์ ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€
์ž๋ฆฟ์ˆ˜ 1์˜ ๊ฐ’์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
๋งŒ๋Šฅ์ธ.

์ด๊ฒƒ์€ ๋” ๋‚˜์˜๊ฒŒ ๋‚ด๋ ค๊ฐ‘๋‹ˆ๋‹ค-๊ฑฐ์ง“ ์Œ์„ฑ ๋˜๋Š” ๊ฑฐ์ง“ ์–‘์„ฑ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ์˜ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์˜คํƒ์€ ํ›จ์”ฌ ๋” ๋‚˜์ฉ๋‹ˆ๋‹ค.

(์˜ˆ : ํ†ต๊ณผํ•ด์„œ๋Š” ์•ˆ๋˜๋Š” ํ…Œ์ŠคํŠธ)

์‚ฌ์šฉ์ž๋Š” ์ ˆ๋Œ€ / ์ƒ๋Œ€ ๊ณต์ฐจ์™€
ํ•จ์ˆ˜๋Š” ์‹ค์ œ๋กœํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ํ•จ์ˆ˜์—๋Š” ํ•ฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ’๊ณผ
์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๊ฐ•๋ ฅํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜.

๋‚˜๋Š” ๋ฌธ์„œ๋ฅผ ๊ฐœ์„ ํ•˜๊ณ  ๊ธฐ๋Šฅ์€ ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์นญ์˜ ๋ถ€์กฑ์€ "isclose (a, b)๋Š” a๊ฐ€ b์— ๊ฐ€๊น๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€๋งŒ ๋ถ€๋™ ์†Œ์ˆ˜์ ์˜ ์ ˆ๋Œ€ ์ •๋ฐ€๋„๊ฐ€ ๋‹ค์–‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ b๊ฐ€ a์— ๊ฐ€๊นŒ์šด ๊ฒฝ์šฐ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. b๋Š” ์˜ˆ์ƒ ๊ฒฐ๊ณผ์ด๊ณ  a๋Š” ์‹ค์ œ ๊ฒฐ๊ณผ ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค. " ์ด๊ฒƒ์€ ํ…Œ์ŠคํŠธ์— ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์นญ ํ•จ์ˆ˜ ์ผ€์ด์Šค๋Š” ์‹ค์ œ๋กœ ์ •๋‹นํ™”ํ•˜๊ธฐ๊ฐ€ ์กฐ๊ธˆ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋ˆ—์…ˆ์„ ํฌํ•จํ•˜๋Š” ์ƒ๋Œ€ ์˜ค์ฐจ๋Š” ๋Œ€์นญ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋‚˜๋„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์‚ฌ๋žŒ๋“ค์˜ ์ฝ”๋“œ๋ฅผ ๊นจ๋Š” ๊ฒƒ์€ ๋” ๋‚˜์ฉ๋‹ˆ๋‹ค. numpy๋ฅผ ๊ฐœ์„ ํ•˜์ง€ ์•Š๋Š” ๋‹จ์ˆœํ•œ ๊ฒƒ ์™ธ์— ๋‹ค๋ฅธ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ƒˆ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ƒˆ ํ•จ์ˆ˜๊ฐ€์—†๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ๋‹ค๋Š” ๊ฐ€์น˜ ํŒ๋‹จ์„ ์ด๋ฏธ ํ†ต๊ณผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. imho๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์„ธ ๊ฐ€์ง€ ์˜ต์…˜ :

  1. ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€-ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋…ผ์˜๋ฅผ ์ค‘๋‹จ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋” ๋‚˜์€ ๋ฌธ์„œ ์ถ”๊ฐ€
  3. ๊ธฐ๋Šฅ ์ถ”๊ฐ€

2๋Š” ์ „๋ฐ˜์ ์œผ๋กœ 3๋ณด๋‹ค ๋‚˜์€ ์„ ํƒ์ด๋ฏ€๋กœ numpy๋ฅผ "๋” ๋‚˜์€"๊ฒƒ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋˜ํ•œ์ด atol / rtol์ด ๋‹จ์ผ ๊ธฐ๋Šฅ์— ๊ตญํ•œ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ฌด์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค์Œ์€ ์ƒˆ๋กญ๊ณ  ์•ฝ๊ฐ„ "๋” ๋‚˜์€" assert_allclose ? ์ด๊ฒƒ์€ ๋ฌธ์„œ ์ „์šฉ์˜ ๊ฒฝ์šฐ๋ฅผ ๋”์šฑ ๋ช…ํ™•ํ•˜๊ฒŒํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋งค์šฐ ์‹ฌ๊ฐํ•œ ๊ฒฐํ•จ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฝ”๋“œ ํ…Œ์ŠคํŠธ์— ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. numpy.isclose ๋ฐ ๊ธฐ๋ณธ atol๋กœ ํ…Œ์ŠคํŠธ๋˜๋Š” ๋‹ฌ์— ๋ฌด์—‡์ด๋“  ๋ณด๋‚ด์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋‘ ๋ฒˆ ์ƒ๊ฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋ฌธ์„œ์—์„œ ์ด๋Ÿฌํ•œ ํ•จ์ •์„ ๋ˆˆ์— ๋„๊ฒŒ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
๋ณ„์นญ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ•์š”ํ•˜์ง€ ์•Š๋Š” ํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค (๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ).

๋‚˜๋Š” ๋Œ€์นญ์ด ์‚ฌ์†Œํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ๊ทธ๊ฒƒ์„ ๊ณ ์ณ์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Œ€๋กœ๋‘๋ฉด ์‹ค์ œ ํ•จ์ •์—์„œ ์‚ฌ์šฉ์ž์˜์ฃผ์˜๊ฐ€ ์‚ฐ๋งŒํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@rgommers ๋Š” ๋‹ค์Œ
"" "
์ƒˆ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ƒˆ ํ•จ์ˆ˜๊ฐ€์—†๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ๋‹ค๋Š” ๊ฐ€์น˜ ํŒ๋‹จ์„ ์ด๋ฏธ ํ†ต๊ณผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. imho๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
"" "
๊ธ€์Ž„, ๋‚˜๋Š” math.isclose ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ํ† ๋ก ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๊ณ , ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ๊ฒƒ๋“ค ์ค‘์—์„œ numpy ๊ตฌํ˜„์„ ์‚ดํŽด ๋ณด๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋Š”์ด ํ† ๋ก ์—์„œ ๊ทธ๊ฒƒ์ด ๊ฑฐ์˜ ํ•ฉ์˜๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋” ๋‚˜์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ / ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ numpy๋กœ ๊ฐ€์ ธ ์˜ค๋ฉด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ numpy์—์„œ ์ด์ „ ๊ธฐ๋Šฅ๊ณผ ์ƒˆ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๊ฐ–๋Š” ๊ฒƒ์ด ๋‹จ์ˆœํžˆ ์ด์ „ (์•„๋งˆ ๋” ์ž˜ ๋ฌธ์„œํ™” ๋œ) ๊ธฐ๋Šฅ์„ ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก , ๊ทธ๊ฒƒ์€ ์™„์ „ํžˆ ํƒ€๋‹นํ•œ ์š”์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ €๋Š” ๊ทธ ๋…ผ์˜๋ฅผํ•˜์ง€ ์•Š์œผ๋ ค ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์ „ ์ฝ”๋ฉ˜ํŠธ๋Š” "10 ๋…„ ๋™์•ˆ ๊ทธ๋ ‡๊ฒŒ ์ž‘๋™ํ•ด์˜จ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๊ณผ ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋™์ž‘์œผ๋กœ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งค์šฐ ์ข‹์ง€ ์•Š์€ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค." ํ† ๋ก ์„ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๋‚ด ์š”์ ์€ ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์ด ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค "์ถฉ๋ถ„ํžˆ ๋‚ซ๋‹ค"๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋ถ„๋ช…ํžˆ ํ•ฉ์˜ํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ์€์ด ํŠน์ • ์˜ต์…˜์ด "๋” ๋‚˜์€"์ง€ ์•„๋‹Œ์ง€ "์ถฉ๋ถ„ํžˆ ๋” ๋‚˜์€์ง€"์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ๊ฒƒ์ด ๋ณ€ํ™”์˜ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์Šค์Šค๋กœ ํ™•์‹ ํ•˜์ง€ ๋ชปํ–ˆ์ง€๋งŒ ๋‚˜๋Š” ํ† ๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ ์ œ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ฐ€์ •์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์ด ์˜ณ์€์ง€ ํ™•์‹คํžˆ ์•Œ ์ˆ˜ ์žˆ์„์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ :

1) np.isclose ()์˜ ๊ฐ€์žฅ ํฐ ์‚ฌ์šฉ์€ ํ…Œ์ŠคํŠธ๋ฅผ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค-๋‹น์‹ ์˜ ๋Œ€๋‹ต์€ ๋‹น์‹ ์ด ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์— ์ถฉ๋ถ„ํžˆ ๊ฐ€๊น์Šต๋‹ˆ๊นŒ? -์ด๊ฒƒ์€ np.assert_all_close๋ฅผ ํ†ตํ•˜๊ฑฐ๋‚˜ ๋” ์ง์ ‘์ ์œผ๋กœ pytest ํ…Œ์ŠคํŠธ์—์„œ ๋˜๋Š” ....

2) ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ๋Œ€๋‹ต์ด ์–ผ๋งˆ๋‚˜ ์ข‹์€์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์—„๊ฒฉํ•œ ๋ถ€๋™ ์†Œ์ˆ˜์  ์˜ค๋ฅ˜ ๋ถ„์„๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ๊ฐ’์„ ์‹œ๋„ํ•˜๊ณ  ์‹คํŒจํ•˜๋ฉด ๊ฒฐ๊ณผ๋ฅผ๋ณด๊ณ  ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ์˜ค๋ฅ˜์ธ์ง€ ๋˜๋Š” ํ…Œ์ŠคํŠธ์˜ ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์กฐ์ •ํ•ด์•ผํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ์ด๊ฒƒ์€ atol๊ณผ rtol์ด ๋ณ‘ํ•ฉ๋˜๋Š”์ง€ ์—ฌ๋ถ€์™€ ํ…Œ์ŠคํŠธ๊ฐ€ ๋Œ€์นญ์ธ์ง€ ์—ฌ๋ถ€๊ฐ€ ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

3) ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ (2)์—์„œ ๊ธฐ๋ณธ ํ—ˆ์šฉ ์˜ค์ฐจ๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•œ ๊ฒฝ์šฐ์—๋งŒ ํ—ˆ์šฉ ์˜ค์ฐจ๋ฅผ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

  • ์ด๊ฒƒ์€ ๊ธฐ๋ณธ atol์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์œ„ํ—˜ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋ฉด ์•ˆ๋˜๋Š” ๊ฒƒ์€ ์ •๋ง ๋‚˜์œ ์ผ์ž…๋‹ˆ๋‹ค.

4) ์‚ฌ๋žŒ๋“ค์€ ๋ฌธ์„œ๋ฅผ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์ดˆ๊ธฐ "๋‚ด๊ฐ€ ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๋ถ€๋ฅด๋Š”๊ฐ€"๋‹จ๊ณ„๋ฅผ ๋„˜์–ด์„œ)-์ ์–ด๋„ ๊ทธ๋“ค์ด ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ํ–‰๋™์„ ๋ฐœ๊ฒฌ ํ•  ๋•Œ๊นŒ์ง€๋Š” ๋ง์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ทธ๋“ค์€ ๋“ค์–ด๊ฐ€์„œ ํ˜ผ๋ž€์„ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๊ฒƒ์ด ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋ ค๊ณ  ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค . ๊ทธ๋Ÿฌ๋‚˜ (3)์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌธ์„œ๋ฅผ๋ณด๊ณ  ์ด์œ ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์ด numpy๊ฐ€ ๋” math.isclose์™€ ์œ ์‚ฌํ•œ FP ๊ทผ์ ‘์„ฑ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด "๋” ๋‚˜์„ ๊ฒƒ"์ด๋ผ๋Š” ๊ฒฐ๋ก ์— ์ด๋ฅด๊ฒŒํ•ฉ๋‹ˆ๋‹ค.

์™œ ๋” ๋‚˜์€ ๋ฌธ์„œ๊ฐ€ ์ข‹์€ ์•„์ด๋””์–ด์ง€๋งŒ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€์ง€.

์•„๋งˆ๋„ ๋‚ด๊ฐ€ ์™„์ „ํžˆ ํ‹€๋ ธ์„ ์ˆ˜๋„ ์žˆ๊ณ , ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ๋ฌธ์„œ๋ฅผ์ฃผ์˜ ๊นŠ๊ฒŒ ์ฝ๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„ ๋™์•ˆ ๋ฌธ์ œ์— ๋Œ€ํ•ด rtol๊ณผ atol์„ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์ €๋Š” ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

: bikeshed : (์ด๋Ÿฐ, ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฉ‹์ง„ ์ด๋ชจํ‹ฐ์ฝ˜์ด ์—†์Šต๋‹ˆ๋‹ค)

relatively_close ๋˜๋Š” rel_close ?

์ถ”๊ฐ€ "์žฌ๋ฏธ์žˆ๋Š”"์ฃผ๋ฆ„ : assert_allclose๋Š” ์‹ค์ œ๋กœ atol = 0์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ๋ณธ. ์šฐ๋ฆฌ๊ฐ€ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š”์ง€ ํ† ๋ก ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ „์ฒด ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ ๋ถˆ์ผ์น˜. (๋‚ด ํœด๋Œ€ํฐ์—์„œ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.)

2017 ๋…„ 12 ์›” 11 ์ผ 14:58์— "Chris Barker" [email protected]์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

@rgommers https://github.com/rgommers ์ž‘์„ฑ :
"" "
์ด๋ฏธ ์—ฌ๊ธฐ์—์„œ ์ƒˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฐ€์น˜ ํŒ๋‹จ์„ ํ†ต๊ณผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด์—†๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค. imho๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
"" "
๊ธ€์Ž„์š”, ์ €๋Š” ๋งŽ์€ ์‹œ๊ฐ„์„ ์ƒ๊ฐํ•˜๊ณ  ํ† ๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.
math.isclose, ๊ทธ๋ฆฌ๊ณ  numpy ๊ตฌํ˜„๋ถ€ํ„ฐ ์‚ดํŽด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์‚ฌ๋žŒ ์ค‘์—์„œ. ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ์ƒ๊ฐํ–ˆ๋‹ค
์ด ํ† ๋ก ์—์„œ ๊ทธ๊ฒƒ์€ ๊ฝค ๋งŽ์€ ํ•ฉ์˜์˜€์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋” ๋‚˜์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ / ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ numpy๋กœ ๊ฐ€์ ธ ์˜ค๋ฉด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๋‹น์‹ ์€ ์ด์ „๊ณผ ์ƒˆ, ๋” ๋‚˜์€ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
numpy๋Š” ๋‹จ์ˆœํžˆ ์˜ค๋ž˜๋œ ๊ฒƒ์„ ๋– ๋‚˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์•„๋งˆ๋„
๋ฌธ์„œํ™” ๋จ) ๊ธฐ๋Šฅ. ๋ฌผ๋ก , ๊ทธ๊ฒƒ์€ ์™„์ „ํžˆ ์œ ํšจํ•œ ํฌ์ธํŠธ์ด์ง€๋งŒ
๊ทธ ํ† ๋ก ๊ณผ "์†Œ๊ฐœ
๋‹ค๋ฅธ ๊ธฐ๋Šฅ๊ณผ ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋™์ž‘ ๋งŒ์žˆ๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ
10 ๋…„ ๋™์•ˆ ๊ทธ๋ ‡๊ฒŒ ์ž‘๋™ ํ•œ ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งค์šฐ ์ข‹์ง€ ์•Š์€ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. "
ํ† ๋ก ์„ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๋‚ด ์š”์ ์€ ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์ด
๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค "์ถฉ๋ถ„ํ•˜๋‹ค". ์šฐ๋ฆฌ๊ฐ€ ๋ถ„๋ช…ํžˆ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ๊ฒƒ
ํ•ฉ์˜๋Š”์ด ํŠน์ • ์˜ต์…˜์ด "์ถฉ๋ถ„ํžˆ ๋” ๋‚˜์€์ง€"์ž…๋‹ˆ๋‹ค.
"๋” ๋‚˜์€"์ง€ ์—ฌ๋ถ€.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์Šค์Šค๋กœ ํ™•์‹ ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ณ€๊ฒฝํ•˜์ง€๋งŒ ํ† ๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ ์ œ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ฐ€์ •์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์š”
๊ทธ๋“ค์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์‹คํžˆ ์•Œ์ง€๋งŒ :

1.

np.isclose ()์˜ ๊ฐ€์žฅ ํฐ ์‚ฌ์šฉ์€ ํ…Œ์ŠคํŠธ๋ฅผ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋‹น์‹ ์ด ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์— ์ถฉ๋ถ„ํžˆ ๊ฐ€๊น์Šต๋‹ˆ๊นŒ? -์ด๊ฒƒ์€ np.assert_all_close๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
๋” ์ง์ ‘์ ์œผ๋กœ, pytest ํ…Œ์ŠคํŠธ์—์„œ ๋˜๋Š” ....
2.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ์—„๊ฒฉํ•œ
๋‹ต๋ณ€์ด ์–ผ๋งˆ๋‚˜ ์ข‹์€์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ์œ„ํ•œ ๋ถ€๋™ ์†Œ์ˆ˜์  ์˜ค๋ฅ˜ ๋ถ„์„
์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ๊ฐ’์„ ์‹œ๋„ํ•˜๊ณ  ์‹คํŒจํ•˜๋ฉด
๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ค์ œ๋กœ ์˜ค๋ฅ˜์ธ์ง€ ๋˜๋Š” ์กฐ์ •ํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
ํ…Œ์ŠคํŠธ์˜ ํ—ˆ์šฉ ์˜ค์ฐจ.

  • ์ด๊ฒƒ์€ atol๊ณผ
    rtol์ด ๋ณ‘ํ•ฉ๋˜๊ณ  ํ…Œ์ŠคํŠธ๊ฐ€ ๋Œ€์นญ์ธ์ง€ ์—ฌ๋ถ€.

  • ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด (2)์—์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    ๊ธฐ๋ณธ ๊ณต์ฐจ, ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•œ ๊ฒฝ์šฐ์—๋งŒ ๊ณต์ฐจ๋ฅผ ์กฐ์ •ํ•˜์‹ญ์‹œ์˜ค.

  • ์ด๊ฒƒ์€ ๊ธฐ๋ณธ atol์ด ๋งค์šฐ ์œ„ํ—˜ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    ํ†ต๊ณผํ•ด์„œ๋Š” ์•ˆ๋˜๋Š” ๊ฑด ์ •๋ง ๋‚˜์œ ์ผ์ž…๋‹ˆ๋‹ค.

  • ์‚ฌ๋žŒ๋“ค์€ ๋ฌธ์„œ๋ฅผ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์ดˆ๊ธฐ "๋‚ด๊ฐ€ ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๋ถ€๋ฅด๋Š”๊ฐ€"๋ฅผ ๋„˜์–ด์„œ)
    ๋‹จ๊ณ„)-์ ์–ด๋„ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ํ–‰๋™์„ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š”
    ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋ ค๊ณ 
    ํ˜ผ๋ž€. ๊ทธ๋Ÿฌ๋‚˜ (3) ์ฐธ์กฐ-ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜์ง€ ์•Š์œผ๋ฉด ๊ทธ๋“ค์€
    ์ด์œ ๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด ๋ฌธ์„œ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

์ด ๋ชจ๋“  ๊ฒƒ์ด ๋‚˜๋ฅผ numpy๊ฐ€ "๋” ์ข‹์„"๊ฒƒ์ด๋ผ๋Š” ๊ฒฐ๋ก ์— ์ด๋ฅด๊ฒŒํ•ฉ๋‹ˆ๋‹ค.
๋” ๋งŽ์€ math.isclose-like FP ์นœ๋ฐ€ ์„ฑ ํ…Œ์ŠคํŠธ.

์™œ ๋” ๋‚˜์€ ๋ฌธ์„œ๊ฐ€ ์ข‹์€ ์•„์ด๋””์–ด์ง€๋งŒ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€์ง€.

์•„๋งˆ๋„ ๋‚ด๊ฐ€ ์™„์ „ํžˆ ํ‹€๋ ธ์„ ์ˆ˜๋„ ์žˆ๊ณ , ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ๋ฌธ์„œ๋ฅผ์ฃผ์˜ ๊นŠ๊ฒŒ ์ฝ๊ณ 
๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ rtol๊ณผ atol์„ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.
ํ•˜์ง€๋งŒ ์ €๋‚˜ ์ œ ํŒ€์› 6 ๋ช…์€ ์ œ๊ฐ€
์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์•Œ๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

: bikeshed : (์ด๋Ÿฐ, ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฉ‹์ง„ ์ด๋ชจํ‹ฐ์ฝ˜์ด ์—†์Šต๋‹ˆ๋‹ค)

์•„๋งˆ๋„ relative_close ๋˜๋Š” rel_close?

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/10161#issuecomment-350886540 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์‹ค
https://github.com/notifications/unsubscribe-auth/AAlOaNquy47fsOkvBlxcSa-Mxyhgdimlks5s_bORgaJpZM4Q2J-P
.

3183 ํ˜ธ ๋ง์”€ ์ด์„ธ์š”?

assert_allclose๋Š” ์‹ค์ œ๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ atol = 0์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ถ„์ด ์ข‹์•„์ง‘๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‘˜ ์‚ฌ์ด์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•œ ๊ณผ๊ฑฐ ํ† ๋ก ์˜ ํ๋ฆฟํ•œ ๊ธฐ์–ต์„ ๋˜ ์‚ด๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”,
๋‚ด thermo, fluids ๋ฐ ht ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” numpy์˜ assert_allclose๋ฅผ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์„ ์—ฌ๊ธฐ์—์„œ ๊ณต์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ๋Š” ๋™์ž‘ ์ฐจ์ด๋ฅผ ๋งค์šฐ ๋†€๋ผ์šด ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒํ•˜๋ฉฐ, ๋Œ€์นญ ๋ถ€์กฑ ๋ฐ / ๋˜๋Š” atol๊ณผ rtol ๋ฐ ๊ธฐ๋ณธ atol (assert_allclose์—๋Š” ์—†์Œ , ์•Œ์•„). ๊ทธ๋ž˜์„œ ๋‚ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  assert_allclose์˜ ๋งค์šฐ ์กฐ์žกํ•œ ๊ตฌํ˜„์„ ํ•ดํ‚น ํ•œ ๋‹ค์Œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž„์‹œ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

assert_allclose์˜ ์‚ฌ์šฉ์ด ๋Œ€ํ‘œ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„์ ์œผ๋กœ ์„ ํƒํ•œ ๊ฐ’์„ ๋น„๊ตํ•˜๊ณ  ํ•จ์ˆ˜ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด assert_allclose๋ฅผ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ชจ๋“  ์ข…๋ฅ˜์˜ ํฌ๊ธฐ์˜ int์™€ float๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” rtol ๋˜๋Š” atol์„ ์„ ํƒํ•˜๋Š” ๋ฐ ์ƒ๋Œ€์ ์œผ๋กœ ๊ฑฐ์˜ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ, atol์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ rtol์„ ๋œ ์—„๊ฒฉํ•œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” assert_allclose๋ฅผ ๊ฐ๊ฐ 13159, 1178 ๋ฐ 4243 ๋ฒˆ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋ณ€๊ฒฝ์„ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ฒ„๊ทธ ๋‚˜ ํ…Œ์ŠคํŠธ ์‹คํŒจ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค๊ณ  ๋งํ•˜๊ฒŒ๋˜์–ด ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฐพ์„ ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ํ…Œ์ŠคํŠธ ์‹คํŒจ๋Š” assert_allclose์˜ ๊ตฌํ˜„์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์šด์ด ์ข‹์ง€ ์•Š์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ assert_allclose ๋˜๋Š” isclose์˜ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ๋“  symmetric ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด์„œ๋“  math.allclose์˜ ๋™์ž‘์„ ๋ณต์ œ ํ•œ assert_allclose ๋ชจ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฐœ์ธ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ํŽธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ํ•  ์ผ์ด ๋งŽ๊ณ  ์•„์ง PR๋„ ์—†์—ˆ ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๋ก ํ•œ ๋ฒˆ์ด๋ผ๋„์ด ๊ฒฐํ•จ์— ๋Œ€ํ•ด ๋‚ด ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜์žˆ์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค!

4880์€ ์ œ๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2017 ๋…„ 12 ์›” 11 ์ผ ์˜คํ›„ 5:01, Nathaniel J. Smith [email protected]
์ผ๋‹ค :

4880 https://github.com/numpy/numpy/pull/4880 ์€ ์ œ๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. statsmodel ์˜ˆ์ œ๊ฐ€
๊ธฐ๋ณธ๊ฐ’ atol โ€” 0.0 ์ด์™ธ์˜ ๊ฒƒ์€ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด 2 ๋…„๋งˆ๋‹ค ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ์šฐ๋ฆฌ๊ฐ€
๋งˆ์นจ๋‚ด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ญ”๊ฐ€๋ฅผํ•ฉ๋‹ˆ๊นŒ?

์•„๋งˆ๋„ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ž‘์€ ์‚ฌ๋งˆ๊ท€์ด์ง€๋งŒ ๋•Œ๋กœ๋Š” ๊ทธ ์ž‘์€ ์„ฑ๊ฐ€์‹ฌ์œผ๋กœ ์ธํ•ด
์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ.

๊ทธ๋ฆฌ๊ณ  assert_allclose์˜ atol ๊ธฐ๋ณธ๊ฐ’์ด 0์ด๋ผ๋Š” ๊ฒƒ์— ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.
(๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์ด๋ผ๋Š” ์ ์„ ๋’ท๋ฐ›์นจํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ์ตœ์„ ์˜ ์„ ํƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜) ์šฐ๋ฆฌ ์ค‘ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด
unittest๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํ…Œ์ŠคํŠธ์—์„œ ์ง์ ‘ np.all_close๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ž˜ Ralf, ์šฐ๋ฆฌ๊ฐ€ ๋ณ€ํ™”๋ฅผํ•œ๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ์„ธ ๊ฐ€์ง€ ๋ชจ๋‘๋ฅผ ๋ฐ”๊พธ๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋œ ํ•จ์ˆ˜ :-(. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ๊ทธ๊ฒƒ๋“ค์„ ๋งŒ๋“ค ์ˆ˜์žˆ๋Š” ๊ธฐํšŒ๋ฅผ์ค๋‹ˆ๋‹ค.
๋” ์ผ๊ด€๋œ ๋ณด๋„ˆ์Šค?

py2-3 ์ „ํ™˜์ด ์ž˜ ์ง„ํ–‰๋˜์ง€๋Š” ์•Š์•˜์ง€๋งŒํ•ด์•ผ ํ•  ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์–ด๋–ค ์‹œ์ ์—์„œ "์‚ฌ๋งˆ๊ท€๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค"๋ฒ„์ „์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ–ˆ๋‹ค :-)

์‹ค์ œ๋กœ is_close ๋ฅผ atol=0 ์˜ ์ˆ˜ํ•™ ๋ฒ„์ „์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๋‹ค๋ฅธ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์„ None ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  atol=0 ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค ; True ๋ชจ๋‘ ๋ฐ˜ํ™˜ํ•˜๋ฉด; ์ผ๋ถ€ False ์ด๋ฉด ํ‘œ์ค€ atol ๋‹ค์‹œ ์‹œ๋„ํ•˜๊ณ  ๊ฒฐ๊ณผ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ง€์› ์ค‘๋‹จ ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  "์ด์ „"๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์Šฌํ”„๊ฒŒ๋„ ๋Œ€์นญ๊ณผ atol์„ ๋™์‹œ์— ์ˆ˜ํ–‰ ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค (์ฆ‰, ํ•ญ์ƒ ๋‘ ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ์‹คํ–‰ํ•ด์•ผํ•˜๋Š”๋ฐ, ์•ฝ๊ฐ„ ๋งŽ์ด ๋ณด์ž„). ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋Œ€์นญ์ด ๋ถ€์กฑํ•œ ๊ฒƒ๋ณด๋‹ค atol ๊ธฐ๋ณธ๊ฐ’์„ ํ›จ์”ฌ ๋” ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์–ด๋–ค ๊ธฐ๋Šฅ๋„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜์ง€ ์•Š๋Š”๋‹ค.
์ด์ „ ๋™์ž‘์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ
๋ณ€๊ฒฝ์ด ์™„๋ฃŒ๋˜๋ฉด ์ž๋™ ๋ฆฌํŒฉํ† ๋ง ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค
์ง€๊ธˆ์€ ํƒ์ž ์œ„์—๋„.

py3k ์ „ํ™˜์€ ์šฐ๋ฆฌ๊ฐ€ ๋‹ค์‹œํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.
์—ญํ•  ๋ชจ๋ธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ •๋ฆฌ๋ฅผ ํ•˜๋‚˜์˜ ํฐ ๋ฆด๋ฆฌ์Šค๋กœ ๋กค๋งํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
IMO์— ์ ‘๊ทผํ•˜์‹ญ์‹œ์˜ค.

py2-3 ์ „ํ™˜์ด ์ž˜ ์ง„ํ–‰๋˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ "์‚ฌ๋งˆ๊ท€๋ฅผ ์ œ๊ฑฐํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค"๋ฒ„์ „์ด ์–ธ์  ๊ฐ€๋Š” ์žˆ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :-)

๊ทธ๋ƒฅ ํŠน๋ณ„ํ•œ ๋ฒ„์ „ ๋ฒˆํ˜ธ ์ฃผ์š” ๋ณ€๊ฒฝ ํ™•์ธ์„ ํ•  ์ˆ˜์žˆ๋Š”์ด ์ผ๋ฐ˜์ ์ธ ์ƒ๊ฐ์„ ํ•ด๊ฒฐํ•˜๊ธฐ : ์ผ๋ฐ˜์ ์ธ ๊ทœ์น™์ด์ด ๊ณ ํ†ต์„ ๋ฐ›์•„ ๋“ค์ผ ์ˆ˜์—†๋Š” ์ˆ˜์ค€์„ ๋ฐฉ์ง€ ๋ช…ํ™•ํ•œ ์ „ํ™˜ ๊ณ„ํš์ด๊ณ  ์žฅ์ ์ด๋ฅผ ์ •๋‹นํ™”ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ๊ฒฝ์šฐ, ์‚ฌ๋งˆ๊ท€์„ ์ •๋ฆฌ ๊ดœ์ฐฎ์ด๋‹ค ์†Œ์†ก ๋น„์šฉ. ์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ ์šฐ๋ฆฌ๊ฐ€ "๊ทœ์น™์„ ๋”ฐ๋ž๋Š”์ง€"๊ฐ€ ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์— ๋”ฐ๋ผ ํŒ๋‹จํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๋‹น์‹ ์ด ํ™”๋ ค ํ•ด์ง€๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” deontologists๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฒฐ๊ณผ ์ฃผ์˜์ž ์ž…๋‹ˆ๋‹ค.) ๋”ฐ๋ผ์„œ ํŠน์ • ๋ฒ„์ „์„ "์ด๊ฒƒ์€ ๋ฌผ๊ฑด์„ ๊นจ๋œจ๋ฆฌ๋Š” ๊ฒƒ"์ด๋ผ๊ณ  ์„ ์–ธํ•˜๋Š” ์œ ์ผํ•œ ์ด์œ ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ผ์„ ํ›จ์”ฌ ๋” ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. IMO๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ•จ๊ป˜ ๋กค์—…ํ•˜์—ฌ ์–ป์„ ์ˆ˜์žˆ๋Š” ์ด์ ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ „ํ˜€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ (๊นจ์ง„ ์ฝ”๋“œ๋Š” ์†์ƒ๋œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.) ์กด์žฌํ•˜๋”๋ผ๋„ ๋น„์šฉ / ํŽธ์ต ๋ถ„์„์„ "์•„๋‹ˆ์˜ค"์—์„œ "๋กœ ํŒ์„์ฃผ๋Š” ๊ฒฝ์šฐ๋Š” ๋งค์šฐ ๋“œ๋ญ…๋‹ˆ๋‹ค. ์˜ˆ".

atol์€ 0์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (ํŠนํžˆ ํ˜„์žฌ ๋‘˜ ๋‹ค ์ถ”๊ฐ€ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฒฝ์šฐ). ์•ˆ๋˜๋Š” ํ…Œ์ŠคํŠธ ํ†ต๊ณผ๋กœ ์‰ฝ๊ฒŒ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. lazy-๊ธฐ๋ณธ ํ—ˆ์šฉ ์˜ค์ฐจ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ†ต๊ณผํ•˜๋ฉด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์„ ๋•Œ, ๋‚˜๋Š” y ์ฝ”๋“œ๋กœ ๋Œ์•„๊ฐ€์„œ ๊ทธ ์ค‘ ๋ช‡ ๊ฐœ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค-์›์Šค!

statsmodel ์˜ˆ์ œ๋Š” atol์˜ ๊ธฐ๋ณธ๊ฐ’์— ๋Œ€ํ•ด ์ž˜ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. 0.0์ด ์•„๋‹Œ ๊ฒƒ์€ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. [...] ์šฐ๋ฆฌ ์ค‘ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค๊ณผ ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด unittest๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ์—์„œ ์ง์ ‘ np.all_close๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"๋‹ค๋ฅธ ํŒจํ‚ค์ง€์™€์˜ ์ผ๊ด€์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋ฅผ ๊นจ์•ผํ•ฉ๋‹ˆ๋‹ค."๋Š” ๋น„์šฉ / ์ด์ต ์ฒ™๋„์—์„œ ๊ทธ๋‹ค์ง€ ์ข‹์€ ์ ์ˆ˜๋ฅผ๋ฐ›์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. "Numpy ๋‚ด๋ถ€์—๋Š” ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž ์ฝ”๋“œ์—์„œ ์กฐ์šฉํ•œ ๋ฒ„๊ทธ๋กœ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๋ถˆ์ผ์น˜๊ฐ€ ์žˆ์œผ๋ฉฐ,์ด๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."๊ฐ€ ํ›จ์”ฌ ๋” ๋งค๋ ฅ์ ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„์ง ์Šค์Šค๋กœ ์˜๊ฒฌ์„ ์ •ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์ง„์ „์„ ์–ป๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ถ”์ง„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ณต์ฑ…:

โ€œโ€โ€๋‚˜๋Š” rtol ๋˜๋Š” atol์„ ์„ ํƒํ•˜๋Š” ๋ฐ ์ƒ๋Œ€์ ์œผ๋กœ ๊ฑฐ์˜ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
์•„ํ†จ์„ ๊ฑฐ์˜ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Œ
-ํ•œ์กฐ๊ฐ-

$๋Š” assert_allclose๋ฅผ ๊ฐ๊ฐ 13159, 1178, 4243 ๋ฒˆ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

-ํ•œ์กฐ๊ฐ-

์ƒˆ๋กœ์šด ๋ฒ„๊ทธ ๋‚˜ ํ…Œ์ŠคํŠธ ์‹คํŒจ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค .

"" "

์ข‹์€ ์†Œ์‹์ด์ง€๋งŒ assert_allclose์˜ atol ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค. ๊ณผ
์ด๋Š” ์ด์œ  :-)

@njsmith ๋Š” ๋‹ค์Œ

"๋‹ค๋ฅธ ํŒจํ‚ค์ง€์™€์˜ ์ผ๊ด€์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋ฅผ ๊นจ์•ผํ•ฉ๋‹ˆ๋‹ค."

๋‚˜๋Š”์ด ์Šค๋ ˆ๋“œ์˜ ๋ˆ„๊ตฌ๋„ ๊ทธ๊ฒƒ์„ ์˜นํ˜ธํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. โ€“ ๋‚˜๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋‚˜ ์˜นํ˜ธํ•˜๋Š” ์œ ์ผํ•œ ์ผ๊ด€์„ฑ์€ ๊ด€๋ จ๋œ numpy ํ•จ์ˆ˜ ๊ฐ„์˜ ์ผ๊ด€์„ฑ์ž…๋‹ˆ๋‹ค.

"Numpy ๋‚ด๋ถ€์—๋Š” ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž ์ฝ”๋“œ์—์„œ ์กฐ์šฉํ•œ ๋ฒ„๊ทธ๋กœ ์ง์ ‘ ์ด์–ด์ง€๋Š” ๋ฐฉ์‹์œผ๋กœ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๋ถˆ์ผ์น˜๊ฐ€ ์žˆ์œผ๋ฉฐ,์ด๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."

๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ์ ์–ด๋„ ์˜นํ˜ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์—†์ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋œจ๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ง€์› ์ค‘๋‹จ์ฃผ๊ธฐ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๊ฒƒ์ด ์ถฉ๋ถ„ํžˆ ์‹ฌ๊ฐํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜๋Š”

์ƒˆ ํ”Œ๋ž˜๊ทธ ๋˜๋Š” ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ.

์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ๋” ๊นจ๋—ํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ์ฝ”๋“œ๋Š” ์›ํ•˜๋Š”๋งŒํผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  ์ƒˆ ์ฝ”๋“œ๊ฐ€ ์ƒˆ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฒ€์ƒ‰ ๋ฐ ๋ฐ”๊พธ๊ธฐ (๋˜๋Š” ํ˜ธ์ถœ๋กœ ๋ช‡ ๋ฒˆ ๊ฐ€์ ธ ์˜ค๊ธฐ)๋ฅผ ํ†ตํ•ด ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํŒŒ์ผ์„ ์‰ฝ๊ฒŒ ์ „ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(๋‚˜๋Š” ๋‹น์‹ ์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ์›์ˆญ์ด ํŒจ์น˜ numpy์กฐ์ฐจ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ....)

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค :

  • allclose
  • assert_allclose
  • assert_almost_equal
  • assert_approx_equal
  • assert_array_almost_equal
  • assert_array_almost_equal_nulp
  • assert_array_max_ulp

์ด ๋ชฉ๋ก์— ๋” ๋งŽ์€ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ ์‹ค์ œ ์‚ฌ์šฉ์ž์—๊ฒŒ ํฐ ์ฐจ์ด๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๋‚˜๋Š” math.isclose์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ํ† ๋ก ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๊ณ , ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ๊ฒƒ๋“ค ์ค‘์—์„œ numpy ๊ตฌํ˜„์„ ์‚ดํŽด ๋ณด๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ €๋„ ๊ทธ๋žฌ๊ณ  ์ €๋Š” numpy.testing ์˜ ๋ฉ”์ธ ๋ฉ”์ธํ…Œ์ด๋„ˆ ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฑฐ์˜ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋Œ€๋ฌธ์ž๋กœ ๋‹น์‹ ์ด ์˜ณ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋ ‡๊ฒŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ numpy์—์„œ ์ด์ „ ๊ธฐ๋Šฅ๊ณผ ์ƒˆ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๊ฐ–๋Š” ๊ฒƒ์ด ๋‹จ์ˆœํžˆ ์ด์ „ (์•„๋งˆ ๋” ์ž˜ ๋ฌธ์„œํ™” ๋œ) ๊ธฐ๋Šฅ์„ ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก , ๊ทธ๊ฒƒ์€ ์™„์ „ํžˆ ํƒ€๋‹นํ•œ ์š”์ ์ด์ง€๋งŒ ์ €๋Š” ๊ทธ ๋…ผ์˜๋ฅผํ•˜์ง€ ์•Š์œผ๋ ค ๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค, ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๊ฐ€ ๋ถ„๋ช…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

"10 ๋…„ ๋™์•ˆ ๊ทธ๋ ‡๊ฒŒ ์ž‘๋™ํ•ด์˜จ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๊ณผ ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋™์ž‘์„ ๊ฐ€์ง„ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งค์šฐ ์ข‹์ง€ ์•Š์€ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค."

์•„๋‹ˆ์š”, ๋„ˆ๋ฌด ์ž์ฃผ ๋ฌด์‹œ๋˜๊ฑฐ๋‚˜ ์ถฉ๋ถ„ํ•œ ๊ฐ€์ค‘์น˜๊ฐ€ ๋ถ€์—ฌ๋˜์ง€ ์•Š์€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ์žˆ์–ด ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ์ง€์ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ๋งŽ์€ ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๋ถ„๋ช…ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.์ด ๋ฐฐ๊ฐ€ @njsmith , @pv , @charris ๋ฐ ์ €์—๊ฒŒ์„œ ํ•ญํ•ดํ–ˆ๋‹ค๋Š” ํŒ๋‹จ์„ ๋‚ด๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‹ค์‹œ ํ•ด์‹ฑํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋ฏธ๋ฆฌ ์‚ฌ๊ณผํ•˜์ง€๋งŒ assert_allclose ์€ ์˜ฌ๋ฐ”๋ฅธ ํ–‰๋™์ž…๋‹ˆ๋‹ค (๋˜๋Š” ์ ์–ด๋„ ๊ทธ๊ฒƒ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ isclose ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ง€์ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ ˆ๋Œ€์ ์ธ ๊ด€์šฉ์„ ๊ฐ€์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ๋žŒ๋“ค์„ ๋ฌธ์ œ์— ๋น ๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ–‰๋™์— ๋Œ€ํ•ด ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ฒฝ๊ณ ํ•˜๊ธฐ ์œ„ํ•ด np.isclose ๋ฌธ์„œ ํŽ˜์ด์ง€์— ํฐ ๋นจ๊ฐ„์ƒ‰ ์ƒ์ž๋ฅผ ๋„ฃ๋Š” PR ์ œ์ถœ์„ ๊ณ ๋ ค ์ค‘์ž…๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋“ค๋ฆฌ๋‚˜์š”?

๋‹ค์‹œ ํ•ด์‹ฑ ํ•œ ๊ฒƒ์— ๋Œ€ํ•ด ๋ฏธ๋ฆฌ ์‚ฌ๊ณผ ๋“œ๋ฆฌ์ง€๋งŒ assert_allclose ๋Š”
์˜ฌ๋ฐ”๋ฅธ ํ–‰๋™ (๋˜๋Š” ์ ์–ด๋„ ๊ทธ๊ฒƒ์— ๊ฐ€๊น๊ฒŒ). ๊ทธ๋Ÿฌ๋‚˜ isclose๋Š”
๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ฒ˜๋Ÿผ ์ ˆ๋Œ€์ ์ธ ๊ด€์šฉ์„ ๊ฐ€์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
์œ ๋ช…ํ•œ. ํฐ ๋นจ๊ฐ„ ์ƒ์ž๋ฅผ ์˜ฌ๋ ค ๋†“๊ธฐ ์œ„ํ•ด PR ์ œ์ถœ์„ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๋™์ž‘์— ๋Œ€ํ•ด ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ฒฝ๊ณ ํ•˜๋Š” np.isclose ๋ฌธ์„œ ํŽ˜์ด์ง€. ์–ด๋–ป๊ฒŒ
๊ทธ ์†Œ๋ฆฌ?

+1

๋‚˜๋Š” ๋ฌธ์„œ๊ฐ€ ๋” ๋‚˜์•„์•ผํ•œ๋‹ค๋Š” ํ•ฉ์˜๊ฐ€์žˆ๋‹ค.

๊ฐ์‚ฌ,

-CHB

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/numpy/numpy/issues/10161#issuecomment-351182296 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์‹ค
https://github.com/notifications/unsubscribe-auth/AA38YDw4sdhRWYmeeyr4met1RCwWsjMQks5s_uBmgaJpZM4Q2J-P
.

๋ฌธ์„œ ๊ฐœ์„ ์„์ง€์ง€ํ•˜์ง€๋งŒ ์ œ์•ˆ ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋„์›€์ด๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

.. ๊ฒฝ๊ณ  :: ๊ธฐ๋ณธ atol ์€
1๋ณด๋‹ค ํ›จ์”ฌ ์ ์Šต๋‹ˆ๋‹ค.

์ฒซ์งธ,์ด ๊ฒฝ๊ณ ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. 1e-8 ๋ณด๋‹ค ์ž‘์€ ์ˆซ์ž๋ฅผ 0์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ atol _is_๊ฐ€ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ƒ๋Œ€ ๊ณต์ฐจ๋กœ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ ˆ๋Œ€ ๊ณต์ฐจ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ, 1e-8 ๋ณด๋‹ค ์ž‘์€ ์ˆซ์ž๋ฅผ ์˜๋ฏธ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ atol _๋Š” ์ ์ ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค _. ํ•˜๋‚˜์˜ ํฌ๊ธฐ๊ฐ€ ๋ชจ๋“  ๊ฒƒ์— ์ ํ•ฉํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๋”ฐ๋ผ์„œ @xoviat ๋Š” ๊ฐ€์žฅ ๊นŠ์€ ์กด๊ฒฝ์‹ฌ์„ ๊ฐ€์ง€๊ณ  ๊ท€ํ•˜์˜ ์ฃผ๊ด€์ ์ธ ์ง„์ˆ ์— ๊ฐ•๋ ฅํžˆ ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

... assert_allclose _is_ ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘์ž…๋‹ˆ๋‹ค (๋˜๋Š” ์ ์–ด๋„ ์ด์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค).

ํ˜„์žฌ ๋ฌธ์„œ์˜ ๋ฌธ์ œ์ ์€ _what_ atol ์„ (๋ฅผ) ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ํ›Œ๋ฅญํ•˜์ง€๋งŒ _why_๋Š” ์„ค๋ช…ํ•˜์ง€ ์•Š์•„์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋Š”์‹œ๊ธฐ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. .

๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

" atol ์˜ 0์ด ์•„๋‹Œ ์ž‘์€ ๊ฐ’์„ ์„ค์ •ํ•˜๋ฉด 0์— ๋งค์šฐ ๊ฐ€๊นŒ์šด ์ˆซ์ž๋ฅผ ์‚ฌ์‹ค์ƒ 0๊ณผ ๋™์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ atol ์˜ ๊ธฐ๋ณธ๊ฐ’์€ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ์šฐ. ์„ ํƒ atol ๋ณด๋‹ค ํฐ ์ˆ˜ ์žˆ๋„๋ก atol ์˜๋ฏธ์žˆ๋Š” (์ œ๋กœ ๊ตฌ๋ณ„)๋กœ ๊ณ ๋ คํ•˜๊ณ ,๋ณด๋‹ค ์ž‘์€ ์ˆซ์ž atol ๋‹น์‹ ์ด ๋ฌด์‹œํ•  ์ˆ˜๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค (0๊ณผ ๋™์ผ). "

๋งˆ์ง€๋ง‰์œผ๋กœ isclose ๋ฐ allclose ์˜ ๋… ์ŠคํŠธ๋ง์— ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ œ ์ œ์•ˆ์ž…๋‹ˆ๋‹ค. ๋ฐ›๋˜๊ฐ€ ๋ง๋˜๊ฐ€.
๊ฑด๋ฐฐ.

PR์— ๋Œ€ํ•œ ๋ฆฌ๋ทฐ ํ”ผ๋“œ๋ฐฑ์„ ๋‚จ๊ฒจ์ฃผ์„ธ์š”. ํŠนํžˆ ๊ท€ํ•˜์˜ ์ œ์•ˆ์€ ๋„ˆ๋ฌด ์žฅํ™ฉํ•œ IMO์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋„ˆ๋ฌด ์งœ์ฆ ๋‚˜๋ฉด ๋ฏธ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ํ•ฉ์˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

@xoviat : ๋ฌธ์„œ ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‹ค์‹œ ๋‚˜์˜ฌ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋‚˜๋Š” ๊ฑฐ์ ˆํ•˜๋„๋ก ์„ค๊ณ„๋œ NEP์˜ ๋ฏธ๋‹ˆ ๋ฒ„์ „์œผ๋กœ์ด ํ† ๋ก ์„ ๋๋‚ด๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค .- ์ œ์•ˆ๊ณผ ๊ฑฐ์ ˆ ์ด์œ ๋ฅผ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ก์„ ์œ„ํ•ด-์ด์ „ ๋ฌธ์ œ๊ฐ€ ์•ฝ๊ฐ„ ์‚ฌ๋ผ์กŒ๊ธฐ ๋•Œ๋ฌธ์—.

py2 / 3 ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•˜์—ฌ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค-numpy์—์„œ ์‚ฌ๋งˆ๊ท€๋ฅผ ์ •๋ฆฌํ• ์ง€ ์—ฌ๋ถ€๋Š” ๋‹ค๋ฅธ ์žฅ์†Œ์™€ ์‹œ๊ฐ„์— ๋Œ€ํ•œ ํ† ๋ก ์ž…๋‹ˆ๋‹ค.

isclose()

์ด ๋ฌธ์ œ (๋ฐ ๊ธฐํƒ€ ์ฐธ์กฐ)๋Š” numpy.isclose() ๋ฐ ์นœ๊ตฌ๋“ค์ด ์ตœ์ ์ด ์•„๋‹Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๊ณ  atol์— ๋Œ€ํ•ด ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€์žˆ๋Š” ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋‹ค์–‘ํ•œ ๊ด€๋ จ ํ•จ์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’์ด ์„œ๋กœ ๋‹ค๋ฅด๋‹ค๋Š” ๊ด€์ฐฐ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์ „์ฒด์ ์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ˜ผ๋ž€์ด ์ƒ๊ธฐ๊ณ  ์ตœ์•…์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ atol ๊ฐ’ ์„ค์ •์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์˜ค ํƒ์ง€ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ stdlib : math.isclose() ์˜ ๊ตฌํ˜„์€ ๋” ๋‚˜์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์นญ ํ…Œ์ŠคํŠธ์ด๊ณ  rtol๊ณผ atol์„ ํ˜ผํ•ฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ธฐ๋ณธ atol์€ 0.0์ž…๋‹ˆ๋‹ค.

์ƒํ™ฉ์ด ์ด์ƒ์ ์ด์ง€ ์•Š๋‹ค๋Š” ๋ฐ๋Š” ๊ฑฐ์˜ ํ•ฉ์˜๊ฐ€ ์ด๋ฃจ์–ด์กŒ์ง€๋งŒ ์ด์— ๋Œ€ํ•ด ๋ฌด์—‡์ด๋“  ํ• ๋งŒํผ ๋‚˜์˜๋‹ค๋Š” ํ•ฉ์˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๊ณ ๋ ค๋˜๋Š” ์˜ต์…˜ :

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐ / ๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’ ๋ณ€๊ฒฝ :

์ง€์› ์ค‘๋‹จ ๊ธฐ๊ฐ„๊ณผ ๊ฒฝ๊ณ ๊ฐ€ ์žˆ๋”๋ผ๋„ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋กœ ์ธํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฑฐ๋ถ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ํ…Œ์ŠคํŠธ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ์ตœ์†Œํ•œ ํฐ ์„ฑ๊ฐ€ ์‹œ๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด ํ”Œ๋ž˜๊ทธ๊ฐ€์žˆ๋Š” ์ถ”๊ฐ€ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ถ”๊ฐ€

์ด๊ฒƒ์€ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์ง€๋งŒ ์ถ”์•…ํ•˜๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฌ์šด API๋กœ ์˜์›ํžˆ ์ง€์†๋ฉ๋‹ˆ๋‹ค.

__future__-์œ ํ˜• ์ง€์‹œ๋ฌธ ์ถ”๊ฐ€

TLDR : ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์‰ฝ๊ฑฐ๋‚˜ ๊นจ๋—ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ์ด๊ฒƒ์„ ์ถ”๊ตฌํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ

์ด ์˜ต์…˜์€ ๊ด€์‹ฌ์„ ๋Œ ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ์˜ต์…˜์œผ๋กœ ๋ณด์˜€์ง€๋งŒ ํ† ๋ก ์— ์ฐธ์—ฌํ•œ ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž๋Š” ์ง€์›ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ "์ˆ˜์ •"ํ•˜๋Š” ๊ฐ€์žฅ ๊นจ๋—ํ•œ ๋ฐฉ๋ฒ•์€ math.isclose ์—์„œ ์‚ฌ์šฉ ๋œ ๊ฒƒ๊ณผ ๊ฐ™์€ ์ƒˆ๋กœ์šด ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ np.rel_close() [๋˜๋Š” ๋‹ค๋ฅธ ์ด๋ฆ„]์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์€ ํ–ฅํ›„ ์ฝ”๋“œ์— ์‚ฌ์šฉํ•  "๊ถŒ์žฅ"๊ธฐ๋Šฅ์œผ๋กœ ๋ฌธ์„œํ™”๋ฉ๋‹ˆ๋‹ค. ํ–ฅํ›„ ์ด์ „ ๋ฒ„์ „์— ์ง€์› ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ์ด ์‹œ์ ์—์„œ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์‚ฌ๋žŒ์€ ์•„๋ฌด๋„ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌํŒฉํ† ๋ง ๋„๊ตฌ๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์ด๋ฒˆ ํ•œ ๋ฒˆ์— ๋ˆ„๊ฐ€ ๊ทธ๋ ‡๊ฒŒํ• ๊นŒ์š”?

์ด๋กœ ์ธํ•ด ๊ฐ€๊นŒ์šด ๋ฏธ๋ž˜์— ๋‘ ๊ฐœ์˜ ๋งค์šฐ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์ด ์ƒ์„ฑ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. "10 ๋…„ ๋™์•ˆ ๊ทธ๋ ‡๊ฒŒ ์ž‘๋™ ํ•œ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๊ณผ ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋™์ž‘์„ ๊ฐ€์ง„ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งค์šฐ ์ข‹์ง€ ์•Š์€ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค."

๊ฒฐ๋ก :

์ž‘์€ ์ด๋“์œผ๋กœ๋Š” ๊ฐ€์น˜๊ฐ€ ์—†์ง€๋งŒ ๋” ๋‚˜์€ ๋ฌธ์„œ๊ฐ€ ์ •๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. # 10214

์•„์ง ํ•œ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

@njsmith ๋Š” ๋‹ค์Œ

"" "
์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค :

assert_allclose
assert_almost_equal
assert_approx_equal
assert_array_almost_equal
assert_array_almost_equal_nulp
assert_array_max_ulp

์ด ๋ชฉ๋ก์— ๋” ๋งŽ์€ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ ์‹ค์ œ ์‚ฌ์šฉ์ž์—๊ฒŒ ํฐ ์ฐจ์ด๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
"" "

์ƒˆ๋กœ์šด ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ดœ์ฐฎ์€ ์•„์ด๋””์–ด๋ผ๋Š” ๋œป์ž…๋‹ˆ๊นŒ?

๋˜ํ•œ ๋‹ค์Œ ์‚ฌํ•ญ์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

์ด๋“ค ๋Œ€๋ถ€๋ถ„์€ ๋‹จ์–ธ์ด๋ฉฐ ๋‹จ์–ธ์˜ ํ™•์‚ฐ์€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์•„ํ‚คํ…์ฒ˜์˜ ๋ถ€์ž‘์šฉ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ์ค‘ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ์•„ํ‚คํ…์ฒ˜ (์˜ˆ : pytest)๋กœ ์ด๋™ํ•จ์— ๋”ฐ๋ผ ์–ด์„ค ์…˜์˜ ํ•„์š”์„ฑ์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ numpy.testing ๋กœ ๋ฌด์—‡์„ ํ•  ๊ฒƒ์ธ๊ฐ€๋Š” numpy ์ฝ”์–ด๋กœ ๋ฌด์—‡์„ ํ•  ๊ฒƒ์ธ๊ฐ€์™€๋Š” ๋ณ„๊ฐœ์˜ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ์ค‘ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ์•„ํ‚คํ…์ฒ˜ (์˜ˆ : pytest)๋กœ ์ด๋™ํ•จ์— ๋”ฐ๋ผ ์–ด์„ค ์…˜์˜ ํ•„์š”์„ฑ์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์‚ฌ์‹ค ์ด๊ฒƒ์€ ๊ทธ ์ž์ฒด๋กœ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋Š” assert_allclose(...) ์—์„œ assert np.allclose(...) ๋กœ ๋ณ€๊ฒฝ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์กฐ์šฉํžˆ ๋œ ์—„๊ฒฉ ํ•ด์ง‘๋‹ˆ๋‹ค. ์ด๋Š” ๋‚˜์œ ์ผ์ž…๋‹ˆ๋‹ค.

์œ ์šฉํ•œ ์‹คํŒจ ๋ฉ”์‹œ์ง€๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ pytest ํ™˜๊ฒฝ์—์„œ assert_allclose ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    def test_shs():
        a = [0.1, 0.2, 0.3, 0.4]
        b = [0.2, 0.3, 0.3, 0.4]

>       np.testing.assert_allclose(a,b)
E       AssertionError: 
E       Not equal to tolerance rtol=1e-07, atol=0
E       
E       (mismatch 50.0%)
E        x: array([ 0.1,  0.2,  0.3,  0.4])
E        y: array([ 0.2,  0.3,  0.3,  0.4])

assert np.allclose() ์‚ฌ์šฉ ๋Œ€๋น„

    def test_shs():
        a = [0.1, 0.2, 0.3, 0.4]
        b = [0.2, 0.3, 0.3, 0.4]
>       assert np.allclose(a, b)
E       assert False
E        +  where False = <function allclose at 0x7f20b13c9840>([0.1, 0.2, 0.3, 0.4], [0.2, 0.3, 0.3, 0.4])
E        +    where <function allclose at 0x7f20b13c9840> = np.allclose

pytest_assertrepr_compare ๊ตฌํ˜„ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ๊ณ  pytest๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ์œ„์น˜๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@ eric-wieser : ์ž‘์„ฑ :

"์‹ค์ œ๋กœ ์ด๊ฒƒ์€ ๊ทธ ์ž์ฒด๋กœ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋Š” assert_allclose (...)์—์„œ np.allclose (...)๋ฅผ ์ฃผ์žฅํ•˜๋„๋ก ๋ณ€๊ฒฝ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์กฐ์šฉํžˆ ๋œ ์—„๊ฒฉ ํ•ด์ง‘๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚˜์œ ์ผ์ž…๋‹ˆ๋‹ค."

๋‚ด ์š”์ ์€ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์–ด์„ค ์…˜์„ ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์€ "๋‚˜์œ ์•„์ด๋””์–ด"์ด๋ฏ€๋กœ isclose () ๋ฐ allclose ()์˜ ๊ธฐ๋ณธ๊ฐ’์ด ํ…Œ์ŠคํŠธ์— ์ ํ•ฉํ•œ ์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค. ํ™•์‹คํžˆํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ดœ์ฐฎ์€ ์•„์ด๋””์–ด๋ผ๋Š” ๋œป์ž…๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”, ๊ฑฐ์˜ ๋™์ผํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋ถˆํ–‰ํžˆ๋„ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๋Š” ์•„์ง ๋‹ค๋ฅธ ์ถ”๊ฐ€ ์‚ฌํ•ญ์„ ์•Œ์•„ ์ฐจ ๋ฆฌ๊ฑฐ๋‚˜ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‹ค์Œ ์‚ฌํ•ญ์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.
์ด๋“ค ๋Œ€๋ถ€๋ถ„์€ ๋‹จ์–ธ์ด๋ฉฐ ๋‹จ์–ธ์˜ ํ™•์‚ฐ์€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์•„ํ‚คํ…์ฒ˜์˜ ๋ถ€์ž‘์šฉ์ž…๋‹ˆ๋‹ค.
์šฐ๋ฆฌ ์ค‘ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ์•„ํ‚คํ…์ฒ˜ (์˜ˆ : pytest)๋กœ ์ด๋™ํ•จ์— ๋”ฐ๋ผ ์–ด์„ค ์…˜์˜ ํ•„์š”์„ฑ์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ๋“ค์€ ์–ด์„ค ์…˜์œผ๋กœ ์ž‘์„ฑ๋˜์ง€๋งŒ AFAICT๋Š” ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ์‹ค์ œ๋กœ "๊ฑฐ์˜ ๊ฐ™์Œ"์ด๋ผ๋Š” ๋‹ค๋ฅธ ์ •์˜๋ฅผ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค. (๋‚˜๋Š” ์ƒ๊ฐํ•œ๋‹ค. ์ผ๋ถ€ ๊ตฌ๋ณ„์ด ๋„ˆ๋ฌด ๋ชจํ˜ธํ•ด์„œ ๊ทธ๊ฒƒ์ด ์ง„์งœ์ธ์ง€ ์•„๋‹Œ์ง€ ๋งํ•  ์ˆ˜ ์—†๋‹ค.)

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐ / ๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’ ๋ณ€๊ฒฝ :
์ง€์› ์ค‘๋‹จ ๊ธฐ๊ฐ„๊ณผ ๊ฒฝ๊ณ ๊ฐ€ ์žˆ๋”๋ผ๋„ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋กœ ์ธํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฑฐ๋ถ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ํ…Œ์ŠคํŠธ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ์ตœ์†Œํ•œ ํฐ ์„ฑ๊ฐ€ ์‹œ๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ™•์‹คํžˆ ๊ทธ๋Ÿฐ ๋„ฃ์–ดํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €์—๊ฒŒ๋Š” ์ด๊ฒƒ์ด ๋น„์šฉ์„ ์ •๋‹นํ™”ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ด์ ์„ ์ž ์žฌ์ ์œผ๋กœ ๊ฐ€์งˆ ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์ด ๊ทธ๋ ‡๊ฒŒ ํ• 

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ˆ„๊ตฐ๊ฐ€ ๋‚˜ํƒ€๋‚˜์„œ "๋‚ด๊ฐ€ ์ œ์•ˆํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ 3 ๊ฐœ์˜ ํฐ ํ”„๋กœ์ ํŠธ์— ์‹œ๋„ํ–ˆ๋Š”๋ฐ, ๊ทธ ๊ฒฐ๊ณผ 10,000 ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ค‘ 12 ๊ฐœ์˜ ์ถ”๊ฐ€ ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ–ˆ์œผ๋ฉฐ ๊ทธ ์ค‘ 12 ๊ฐœ ์ค‘ 8 ๊ฐœ๋Š” ์ด์ „์— ์ˆจ๊ฒจ์ ธ ์žˆ๋˜ ์‹ค์ œ ์กฐ์šฉํ•œ ๋ฒ„๊ทธ์˜€์Šต๋‹ˆ๋‹ค. ๋‚˜์œ ๊ธฐ๋ณธ๊ฐ’ "... ๊ฝค ์„ค๋“๋ ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ข์€ ๋ฒ”์œ„์˜ ๊ฒฝ๊ณ ๋ฅผ ํ•  ์ˆ˜์žˆ๋Š” ๊ธฐ์ˆ ์  ๋Šฅ๋ ฅ์ด์žˆ๋Š” ๊ฒฝ์šฐ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‹ค์ œ ์ˆ˜์น˜๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ˜ธ์˜์ ์ด์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ™•์ธํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋ˆ„๊ฐ€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2017 ๋…„ 12 ์›” 18 ์ผ ์›”์š”์ผ ์˜คํ›„ 3:57, Nathaniel J. Smith <
[email protected]> ์ž‘์„ฑ :

์•„๋‹ˆ, ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ
๋ถˆํ–‰ํžˆ๋„ ๊ฑฐ์˜ ๋™์ผํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•
๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๋Š” ๋˜ ๋‹ค๋ฅธ ์ถ”๊ฐ€ ์‚ฌํ•ญ์„ ์•Œ์•„ ์ฐจ ๋ฆฌ๊ฑฐ๋‚˜ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์Œ, ํ•œ ๊ฐ€์ง€ ํฐ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋ญ”๊ฐ€ ๋‹ค๋ฅด๊ณ  ๋ถ€๋™ ์†Œ์ˆ˜์ ์˜ ๋ณ€๋™์œผ๋กœ
์ฐจ์ด๊ฐ€ ์ค‘์š” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์ƒ๋Œ€์  ๊ทผ์ ‘์„ฑ ํ•จ์ˆ˜๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ
์ข€ ๋” ์ž˜ ํ•ด๋ด". ๋ชฉํ‘œ๋Š” ์ƒˆ๋กœ์šด ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์˜ค๋ž˜๋œ ๊ฒƒ ๋Œ€์‹ ์— (๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ตญ ์˜ค๋ž˜๋œ ๊ฒƒ์„ ๋น„๋‚œ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค).

์†”์งํžˆ ๊ทธ๊ฒŒ ์•„์ด๋””์–ด์— ๋Œ€ํ•œ ๋…ผ์Ÿ์ธ์ง€, ๋ฐ˜๋Œ€์ธ์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ˆ„๊ตฐ๊ฐ€ ๋‚˜ํƒ€๋‚˜์„œ "์ œ ์ œ์•ˆํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ 3 ๋Œ€

10,000 ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ค‘ 12 ๊ฐœ์˜ ์ถ”๊ฐ€ ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
12, 8 ๊ฐœ๋Š” ์˜ค๋ž˜๋œ ์•…๋‹น์— ์˜ํ•ด ์ˆจ๊ฒจ์ ธ ์žˆ๋˜ ์‹ค์ œ ์กฐ์šฉํ•œ ๋ฒ„๊ทธ์˜€์Šต๋‹ˆ๋‹ค.
๊ธฐ๋ณธ๊ฐ’ "... ๊ฝค ์„ค๋“๋ ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ด๊ฒƒ์€
์ข์€ ๋ฒ”์œ„์˜ ๊ฒฝ๊ณ ๋ฅผ ํ•  ์ˆ˜์žˆ๋Š” ๊ธฐ์ˆ ์  ๋Šฅ๋ ฅ์ด์žˆ๋Š” ๊ฒฝ์šฐ.
์‹ค์ œ ์ˆ˜์น˜๋Š” ๊ทธ๋ฆฌ ํ˜ธ์˜์ ์ด์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ
๋ˆ„๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

ํ , ๋‚ด ์ฝ”๋“œ ๊ธฐ๋ฐ˜์—๋Š” 10,000 ๊ฐœ๊ฐ€ ์•„๋‹Œ ์•ฝ 1500 ๊ฐœ์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์‚ฌ๊ฒฉ. ๋‹ค๋ฅธ ๊ฒƒ์ด ์—†๋‹ค๋ฉด ๋ฒ„๊ทธ ๋˜๋Š” ๋ถˆ๋Ÿ‰ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๋” ๋งŽ์€ ๊ฒƒ์„ ์–ป์œผ์‹ญ์‹œ์˜ค
์•ˆ์‹ฌ!

๋ชจ๋‘ ์•ˆ๋…•,

๋™๋ฃŒ๊ฐ€์ด ๋ฌธ์ œ์— ์ง๋ฉด ํ•œ ํ›„ ์—ฌ๊ธฐ์— ์ฐจ์ž„ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

_ ๋ฉด์ฑ… ์กฐํ•ญ : "ํ™”์žฅ์‹ค์—์„œ ๋ถˆ"์„ ์™ธ์น˜๊ณ  ์šธํƒ€๋ฆฌ ๋„ˆ๋จธ๋กœ ๋˜์ง€๊ธฐ ์ „์—๋Š” ๋…ผ๋ฆฌ์— ๋Œ€ํ•ด ๋งŽ์ด ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ถ€๋„๋Ÿฌ์šด ํ•ด์‹œ๋ฅผ ๋งŒ๋“ค์—ˆ ์œผ๋ฉด ์นœ์ ˆ ํ•ด์ฃผ์„ธ์š”.

๋‚˜์—๊ฒŒ์ด ๋ชจ๋“  ๊ฒƒ์€ ๊ณ ์ „์ ์ธ ์•„ํ‚คํ…์ฒ˜ / ๋””์ž์ธ "์น˜ํ‚จ ์•ค ์—๊ทธ"๋ฌธ์ œ-์˜๋ฏธ๋ก  ๋Œ€ ๊ตฌํ˜„๊ณผ ๋งค์šฐ ๋น„์Šทํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฒ„๊ทธ๊ฐ€ ์ฝ”๋“œ ๋‚ด์— ์กด์žฌํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ ๋•Œ๋กœ๋Š” ์˜๋ฏธ ์ฒด๊ณ„ ๋‚ด์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๊ฒฐํ•จ์ด ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋งŒ ์™„๋ฒฝํ•˜๊ฒŒ ๊ตฌํ˜„๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฒ„๊ทธ๋Š” ์ฝ”๋“œ์— ์žˆ์ง€ ์•Š๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์žˆ์ง€๋งŒ ์–ด๋Š ์ชฝ์ด๋“  ์—ฌ์ „ํžˆ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ์ด ํ† ๋ก ์€ "๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ธฐ๋Šฅ"์ด๋ผ๋Š” ๊ณ ์ „์ ์ธ ๋†๋‹ด์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๋ฌผ๋ก , "์„ ํƒ"์€ ๊ทธ์ € ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ IMHO๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋ก ์  ๊ทผ๊ฑฐ์˜ ๋์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์˜๋ฏธ๋ก ์ด ๊ตฌํ˜„ ๋œ ๊ทธ๋Œ€๋กœ ์„ ํƒ๋˜๋ฉด ๊ตฌํ˜„์€ ๋ชจ๋‘ ๋ฉ‹์ง€๊ณ  ํ† ๋ก ์˜ ๋์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ isclose() ์˜ "์›ํ•˜๋Š”"๋ฐ / ๋˜๋Š” "์˜ˆ์ƒ ๋œ"์‹œ๋งจํ‹ฑ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด๊ฒƒ์„ ์ƒ๊ฐํ•˜๋ฉด, ๋‚˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•˜๋Š” ์‹œ๋งจํ‹ฑ์— ์ˆ˜๋ ดํ•˜๊ฒŒ ๋‚จ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ๋งจํ‹ฑ์„ ์ •์˜ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. "๋‹ซ๊ธฐ"์˜ ์ •์˜.

๊ธฐ๋ณธ๊ฐ’

๊ธฐ๋ณธ๊ฐ’๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ด๊ฒƒ์€ ๊ถ๊ทน์ ์œผ๋กœ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ๊นจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž˜๋ชป๋œ ์„ ํƒ์€ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. 0์ด ์•„๋‹Œ ๊ธฐ๋ณธ๊ฐ’์ด abs(a - b) == 0 ๋•Œ ํ•ฉ๋ฆฌ์ ์ธ ๋™์ž‘์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด _only_ ์„ ํƒ ๋˜์—ˆ๋‹ค๋ฉด ์ด๊ฒƒ์€ ํ™•์‹คํžˆ ์ž˜๋ชป๋œ ํ•ด๊ฒฐ์ฑ…์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ์ด ํŠน์ • ์ƒํƒœ๋Š” ์˜๋ฏธ ์ƒ ํŠน์ˆ˜ ์ผ€์ด์Šค์ด๋ฏ€๋กœ ํŠน์ˆ˜ ์ผ€์ด์Šค๊ฐ€ ๋” ๋‚˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. diff๊ฐ€ 0 ์ผ ๋•Œ "close"์˜ ์ •์˜์—๋Š” "wiggle room"์ด ์—†์Šต๋‹ˆ๋‹ค. ์ž์ฒด ์ •์˜ํ•˜๋Š” ์ฝ”๋„ˆ ์Šคํ†ค์ž…๋‹ˆ๋‹ค. ์ฆ‰, _close_๊ฐ€ ์•„๋‹ˆ๋ผ _exact_์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ "close"๋Š” ์ •ํ™•ํ•œ ๊ฐ’๊ณผ์˜ ์ƒ๋Œ€์ ์ธ ํŽธ์ฐจ์ž…๋‹ˆ๋‹ค. . (_ ์ฐธ๊ณ  : _ ํŠน์ˆ˜ ์ผ€์ด์Šค ์กฐ๊ฑด์€ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.)

+ ๋Œ€ max

max _does_๊ฐ€ ์•„๋‹Œ ํ•ฉ๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌํ˜„์œผ๋กœ ์ธํ•ด rel_tol ๋ฐ a_tol ์˜ ํ˜ผํ•ฉ ๋˜๋Š” "๊ทธ๋ฆผ์ž"๋Š” ์œ„์˜ ํ•จ์ˆ˜ ์˜๋ฏธ๋ฅผ ์†์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. "close"์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž์˜ ์ •์˜๋Š” "relative"์™€ "absolute"์˜ ์˜๋ฏธ๋ฅผ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค ๋ฏ€๋กœ ์‚ฌ์†Œํ•˜์ง€ ์•Š์€ ๋ฐฉ์‹์œผ๋กœ ๋ฌถ์—ฌ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์˜๋ฏธ ๋งŒ ๊ณ ๋ คํ•˜๋ฉด์ด ์ธก๋ฉด์€ _is_ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์„ค๋ช… ํ•ฉ๋‹ˆ๋‹ค.

๊ตํ™˜ ์„ฑ (์ฆ‰, ๋Œ€์นญ)

์—ฌ๊ธฐ ๋‘ ์‚ฌ์—…์ž ์ •๋ง ์žˆ์Šต๋‹ˆ๋‹ค - ์—์„œ a-b ๋ฐ <= ์—์„œ |a-b| <= f(a, b, atol, rtol) . ๋บ„์…ˆ์€ ์—ญ ๊ตํ™˜ ์ ์ด์ง€๋งŒ |a - b| ์€ ๊ทธ๋ ‡์ง€ ์•Š์ง€๋งŒ ์ •์˜์— ๋”ฐ๋ผ ๊ตํ™˜ ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ๋งŒ์œผ๋กœ๋Š” f(a, b, atol, rtol) ์˜ ๊ตํ™˜์„ ํ‘œํ˜„ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์—๋Š” ๊ฐ•๋ ฅํ•˜๊ณ  ์•ฝํ•œ ๋…ผ์Ÿ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ๋Šฅ ๋ถ„๋ฆฌ์˜ ์บก์Šํ™” ๋˜๋Š” ๋ถ€์กฑ - - ์•ฝํ•œ์€ ๊ฐ„๋‹จํ•œ๋˜๋Š” arithemtically ๊ตํ™˜ ๋ฒ•์น™ ๋™์•ˆ |a - b| ์˜ ์ง‘ํ–‰ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค f(a, b, atol, rtol) ํ”„๋กœ๊ทธ๋ž˜๋ฐ, f(a, b, atol, rtol) ์ •๋ง ์•„๋‹™๋‹ˆ๋‹ค์„ ์งˆ๋ฌธ์ด์ง€๋งŒ isClose(a, b, atol, rtol) . ์—ฌ๊ธฐ์„œ |a - b| ๊ณ„์‚ฐ์€ isClose() := |a-b| <= f(a, b, atol, rtol) ํ•จ์ˆ˜์— ๋Œ€ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๋ถ€์ด๊ณ  a ๋ฐ b ๊ฐ€ ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— |a-b| ๊ฐ€ ๊ตํ™˜ ํ˜•์ด ๋˜๋ ค๋ฉด isClose() ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ |a-b| ์˜ commutativity๋Š” ๋ชจ๋“  ์˜๋ฏธ๋ฅผ ์žƒ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ•๋ ฅํ•œ ์ธ์ˆ˜ : ๋น„๊ต ์ž‘์—…์€ ์—„๊ฒฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, <= ์•„๋‹ˆ๋ผ < ์ด๋ฏ€๋กœ ๋น„๊ต์˜ ๋™๋“ฑ ๋ถ€๋ถ„์— ๋Œ€ํ•ด |a-b| = f(a, b, atol, rtol) ๋ฅผ ์˜๋ฏธํ•˜๋Š” f(a, b, atol, rtol) _must_ ์—ญ์‹œ ๊ตํ™˜ ์ ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค (๋‚ด ์ƒ๊ฐ์—๋Š”?). ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์€ ์œ„์˜ ํ‰๋“ฑ์ด _never_ true (์ด๋ฅผ ์ถฉ์กฑํ•˜๋Š” a & b ์ด ์—†์Œ)์ด๊ฑฐ๋‚˜ ์™„์ „ ๋ถˆํ‰๋“ฑ ์ธ < ๊ฐ€ ์‹ค์ œ๋กœ ์˜๋ฏธ ๋ก ์ ์œผ๋กœ ์ •์˜ ๋˜์—ˆ์ฃ ?

์ด๊ฒƒ์˜ ์ „๋ถ€ ๋˜๋Š” ์ผ๋ถ€์— ๋Œ€ํ•ด ๋‹น์‹ ์ดํ•˜๋Š” (๋˜๋Š”ํ•˜์ง€ ์•Š๋Š”) ๊ฒƒ์€ ์™„์ „ํžˆ ๋ณ„๊ฐœ์˜ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰