Sagemath์์ ์ฐ๋ฆฌ๋ ํฐ์ผ # 22799์์ ๋ง๋ฉ๋๋ค.
RuntimeWarning: invalid value encountered in multiply
numpy.float32
์ซ์์ ๋น numpy ๋ฐ์ดํฐ๋ฅผ ๊ณฑํ๋ ๋์; ์ฆ, numpy๋์ด ๊ณฑ์
์ ์กฐ์ฉํ ์ํํ๋ ๋ฐ ์คํจํด์ผํ๋ฉฐ ์ค์ ๋ก gcc๋ก ๋น๋ํ๊ฑฐ๋ np.float32
๋์ np.float
๋๋ np.float128
ํฉ๋๋ค.
๋ณด๋ค ์ ํํ๊ฒ๋ Python ํธ์ถ์์ ๊ฒฝ๊ณ ๋ฅผ๋ฐ์ต๋๋ค.
type(numpy.float32('1.5')).__mul__(numpy.float32('1.5'), x)
์ฌ๊ธฐ์ x
๋ Sagemath์ RealField
์ ํ์ ๊ณ์๊ฐ์๋ Sagemath ์ผ ๋ณ๋ ๋คํญ์์
๋๋ค. (๊ทธ๋ฆฌ๊ณ ์ด ํน์ ์ ํ์ ๋ฐ์ดํฐ ๋ง์ด๋ฅผ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค).
์ฆ, ์ ์ฌ์ ์ผ๋ก ๊ทธ๋ฌํ ์๋ฏธ์๋ ๊ฒฝ๊ณ ๋ Sagemath ์ธ๋ถ์์ ๋ฐฉ์ถ ๋ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ clang 4.0์ ์ฌ์ฉํ๋ Linux์ clang 4.0 ๋๋ clang 3.7์ ์ฌ์ฉํ๋ FreeBSD 11.0๋ฟ๋ง ์๋๋ผ ์ฌ๊ณ cc (clang 3.8์ ์ผ๋ถ ํ์๋ฌผ)๋ฅผ ์ฌ์ฉํ์ฌ OSX 11.12์์ ์ฌํ ํ ์ ์์ต๋๋ค.
์ ์ฌ์ ์ผ๋ก Sagemath ์ธ๋ถ์์์ด๋ฅผ ์ฌํํ๋ ๋ฐฉ๋ฒ์ ์์ฑ ํ ์ ์์ด์ผํ์ง๋ง x์ ์ด๋ค ํจ์๊ฐ ์ ์ฉ๋๋์ง ํ์ธํ๋ ค๋ฉด์ด __mul__
๊ฐ ์ค์ ๋ก ๊ตฌํ๋๋ ๋ช ๊ฐ์ง ํ์ด ํ์ํฉ๋๋ค.
numpy 1.11๊ณผ 1.12์์๋ ์ด๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
numpy.float32('1.5').__mul__(x)
๋ฐ __add__
๋ฐ __sub__
์ ๋์ผํ ์ฌ์ง.
์ด ์ ํ์ ์ค๋ฅ๋ nan
๋๋ infinity
๋ฅผ ํฌํจํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด์
๋๋ค. np.array(x)
๋ ๋ฌด์์ ๋ฐํํฉ๋๊น?
@ eric-wieser : ๊ฒฝ๊ณ ์์ด array(x, dtype=object)
๋ฐํํฉ๋๋ค.
np.multiply(np.float32('1.5'), x)
๋์ผํ ๊ฒฝ๊ณ ๋ฅผ ํ์ํฉ๋๊น?
numpy.multiply(numpy.float32('1.5'), x)
๋ ๋์ผํ ๊ฒฝ๊ณ ๋ฅผ ์ ๊ณตํฉ๋๋ค.
type(x).__rmul__(numpy.float32('1.5'), x)
์ด๋ป์ต๋๊น?
๋ํ warnings.filterwarnings('error')
๋ฅผ ์คํํ ์ ์๋ค๋ฉด ์ ์ฒด ์คํ ์ถ์ ์ ์ป์ ์ ์์ต๋๋ค.
type(x).__rmul__(numpy.float32('1.5'), x)
TypeError: descriptor '__rmul__' requires a 'sage.structure.element.Element' object but received a 'numpy.float32'
x.__rmul__(numpy.float32('1.5'))
์ ํต๊ณผํฉ๋๋ค.
rmul
์๋ ๋ฐฉ์์ ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ type(x).__rmul__(x, numpy.float32('1.5'))
์๋ฏธํ์ง๋ง x
์ด ์ ๋ง ์ด์ํ์ง ์๋ค๋ฉด x.__rmul__
๊ณผ ๋๊ฐ์ ์ผ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ๋ ์คํจํฉ๋๊น? np.multiply(np.array(1.5, dtype=object), x)
(์ด๋ฒ์๋ filterwarnings
์ ํจ๊ปํ์ธ์)
type(x).__rmul__(x,numpy.float32('1.5'))
์ (๋) ๊ฒฝ๊ณ ์์ด ์งํ๋ฉ๋๋ค.
๊ทธ๋ฐ๋ฐ warnings.filterwarnings('error')
์ค์ ํด๋ ํฅ๋ฏธ๋ก์ด ๊ฒ์ ์์ต๋๋ค.
RuntimeWarning Traceback (most recent call last)
<ipython-input-50-b3ece847d318> in <module>()
sage: np.multiply(np.array(1.5, dtype=object), x)
---------------------------------------------------------------------------
RuntimeWarning Traceback (most recent call last)
<ipython-input-52-706823a0b5a2> in <module>()
----> 1 np.multiply(np.array(RealNumber('1.5'), dtype=object), x)
RuntimeWarning: invalid value encountered in multiply
ํ , ์ธ์ด์ง๋ ๋ด๊ฐ ๊ฑฐ๊ธฐ์์ ์์ํ์ง ๋ชปํ ์ผ์ํ๋ค. ๊ทธ๋๋ float('1.5')
์ ๊ฐ์ ๋์ ์ด๊ฒ ์ฃ ?
์ข์, ๋ด๊ฐ ์๊ฐํ๋ ์ผ์ ๋ค์๊ณผ ๊ฐ๋ค.
numpy
๋ ufunc์์ ๊ฐ์ฒด ๋ฃจํ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ PyNumber_Multiply
๋ง ํธ์ถํฉ๋๋ค.sage
์์ ๋ฌด์ธ๊ฐ๊ฐ FPU์์ ์ค๋ฅ ํ๋๊ทธ๋ฅผ ์ค์ ํ๊ณ ์์ต๋๋ค (ํ์ ๋ฒ๊ทธ?).numpy
๋ ufunc (๊ฐ์ฒด ๋ฃจํ์ ๋ฒ๊ทธ?)๋ฅผ ์ข
๋ฃ ํ ๋ ์ ์์ ์ธ fpu ํ๋๊ทธ ๊ฒ์ฌ๋ฅผ ์ํํ๊ณ sage
๊ฐ ๋จ๊ธด ์ค๋ฅ๋ฅผ ์ฐพ์ต๋๋ค.sage: float(1.5).__mul__(x)
NotImplemented
sage: np.float(1.5).__mul__(x)
NotImplemented
sage: np.float32(1.5).__mul__(x)
/usr/home/dima/Sage/sage/src/bin/sage-ipython:1: RuntimeWarning: invalid value encountered in multiply
#!/usr/bin/env python
1.50000000000000*x
sage: np.float64(1.5).__mul__(x)
/usr/home/dima/Sage/sage/src/bin/sage-ipython:1: RuntimeWarning: invalid value encountered in multiply
#!/usr/bin/env python
1.50000000000000*x
ํธํ์ฑ ์ด์ ๋ก np.float is float
์ ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
np.float32(1.5).__mul__(x)
NotImplemented
๋ฐํํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
๊ฐ์ฒด ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ np.multiply
๋ก ์ฒ๋ฆฌ ํ ์ โโ์๋ค๋ ๊ฒ์ ์๊ณ ์์ผ๋ฏ๋ก ํด๋น ๋ฃจํ ๋ด์์ float * x
๋ค์ ์๋ํฉ๋๋ค. ๋ถํํ๋ ํด๋น ๋ฃจํ๋ฅผ ๋๋ฌ์ผ ๋ํผ๋ sage๊ฐ ์ค์ ํ FPU ํ๋๊ทธ๋ฅผ ์ ํํฉ๋๋ค.
์์ธํ ์ดํด๋ณด๋ฉด x.__rmul__
๊ฐ ์ฌ์ ํ ์คํ์์ ๋ ๊น๊ฒ ํธ์ถ๋๊ณ ์์์ ์ ์ ์์ต๋๋ค.
sage: np.float32(1.5)*x
/usr/home/dima/Sage/sage/src/bin/sage-ipython:1: RuntimeWarning: invalid value encountered in multiply
#!/usr/bin/env python
1.50000000000000*x
sage: np.float128(1.5)*x
1.50000000000000*x
sage: np.float64(1.5)*x
/usr/home/dima/Sage/sage/src/bin/sage-ipython:1: RuntimeWarning: invalid value encountered in multiply
#!/usr/bin/env python
1.50000000000000*x
np.float128
๊ฐ ๊ด์ฐฎ์ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง
sage: np.float128(1.5).__mul__(x)
/usr/home/dima/Sage/sage/src/bin/sage-ipython:1: RuntimeWarning: invalid value encountered in multiply
#!/usr/bin/env python
1.50000000000000*x
์ด๊ฒ์ ์ด์ํฉ๋๋ค. ์ปดํ์ผ๋ฌ ๋ฒ๊ทธ, ์๋ง๋ (์ฐ๋ฆฌ๊ฐ gcc์์ ๊ฒฐ์ฝ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์), ๊ทธ๋ฌ๋ ์ด๋ ๊ณณ์์?
FPU ํ๋๊ทธ๋ ์ด๋ค ์ด์ ๋ก clang์ ์ค์ ๋์ด ์์ง๋ง ์ธ์ด์ง ์ฝ๋ ๋ด์์๋ gcc๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. Numpy๋ ๊ทธ๊ฒ์ ๋ํด ์์์๋ด๋ ์ฑ ์์ด ์์ง๋ง ์ฒ์์ ๊ทธ๊ฒ์ ์ค์ ํ ์ฑ ์์ ๋งค์ฐ ์์ฌ ์ค๋ฝ์ต๋๋ค.
๋ถํํ๋ numpy
๋ FPU ํ๋๊ทธ๋ฅผ ๋ช
์ ์ ์ผ๋ก ์์ฒญํ ์์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ์ด๋ ํ์ ๋ด์์ ๋ฌธ์ ๋ฅผ ์๋ถํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
๋๋ ์ด๊ฒ์ด ๋์ผํ ๊ฒฝ๊ณ ๋ฅผ ์ ๋ฐํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค (๊ทธ๋ ๊ฒํ๋ ค๋ฉด 1.12๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค)
mul = np.vectorize(x.__rmul__)
mul(float('1.5'))
๋๊ฐ์ง๋ ์์ง๋ง ๊ฐ๊น์ต๋๋ค.
/usr/home/dima/Sage/sage/local/lib/python2.7/site-packages/numpy/lib/function_base.py:2652: RuntimeWarning: invalid value encountered in __rmul__ (vectorized)
outputs = ufunc(*inputs)
array(1.50000000000000*x, dtype=object)
์ข์์, ์ด๊ฒ์ np.float32
๋๋ np.float64
ํน๋ณํ ๊ฒ์ด ์์์ ๋ํ๋ด๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฌ๊ธฐ์์ ๊ฒฝ๊ณ ๋ฅผ ์์ฑํ๋ ๋ ์ผ๋ฐ์ ์ธ numpy ๋ฉ์ปค๋์ฆ์
๋๋ค.
์ปดํ์ผ๋ฌ ์์ฑ์๊ฐ ๋ฒ๊ทธ๋ก ๊ฐ์ฃผํ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ฒฝ๊ณ ๊ฐ ์๋ํ๋ ๋ฐฉ์์ ํ๋ก์ธ์๊ฐ ์ถ์ ํ๋ ์ผ๋ถ ๋งค์ง ์ํ ํ๋๊ทธ๊ฐ ์์ผ๋ฉฐ ํด๋น ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ์๋์ผ๋ก ์ค์ ๋ฉ๋๋ค. Numpy๋ ๊ณ์ฐ์ ์์ํ๊ธฐ ์ ์์ด๋ฅผ ์ง์ฐ๊ณ ๋ง์ง๋ง์ ๋ค์ ํ์ธํฉ๋๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ์ง์ ์ฌ์ด ์ด๋๊ฐ์์ clang์ ์ํด ์์ฑ ๋ ์ด์ ๋ธ๋ฆฌ๋ NaN์ ํฌํจํ๋ ๊ณ์ฐ์ ์ํํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ถ์ ํ๊ธฐ๊ฐ ์ด๋ ต๊ณ (์ค์ ํ๋๊ทธ ์ค์ ์ ์ ์ ์ผ๋ก ํ๋์จ์ด์์ ์ํ๋๊ธฐ ๋๋ฌธ์) ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ฌ๋๋ค์ ์ฝ๋๊ฐ fpu ํ๋๊ทธ์ ์ด๋ป๊ฒ ์ํฅ์ ๋ฏธ์น๋์ง ๊ฑฑ์ ํ์ง ์์ต๋๋ค. (Libm ๊ตฌํ์ ์ด๋ฌํ ํ๋๊ทธ๋ฅผ ์ค์ ํ๋์ง ์ฌ๋ถ์ ๋ํด์๋ ์ผ๊ด ์ ์ด ์ง ์์ ๊ฒ์ผ๋ก ์ ๋ช ์ด ๋์ต๋๋ค.) ์ ํํ ๊ฒฐ๊ณผ๋ ์์ฑ๋๋ ์ ํํ asm์ ๋ฐ๋ผ ํฌ๊ฒ ๋ฌ๋ผ ์ง๋ฏ๋ก ๋ค๋ฅธ ๊ตฌ์ฑ์ด ์๋ ํน์ ๊ตฌ์ฑ์์๋ง ๋ณผ ์ ์๋ค๋ ๊ฒ์ ๋๋ผ์ด ์ผ์ด ์๋๋๋ค.
๋ค, ๋ด ์์ฌ์ ํ์ธํ๊ณ ๋๋ฒ๊น ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด ์ฝ๋
def check_fpu(f):
@functools.wraps(f)
def wrapped(*args, **kwargs):
excluded = list(range(len(args))) + list(kwargs.keys())
fvec = np.vectorize(f, excluded=excluded)
return fvec(*args, **kwargs)
return wrapped
Python ํจ์์ ์ ์ฉ๋์ด ํด๋น ์ฝ๋ ์ฒญํฌ ๋ด์์ ๊ฒฝ๊ณ ๋ฅผ ๋ถ๋ฆฌ ํ ์ โโ์์ต๋๋ค.
์ ๋ง์, ๊ทธ๊ฒ์ด ์ ํ ์ผ์ด๋๊ณ ์๋ค๋ ๊ฒ์ ๊ฝค ์ด์ํฉ๋๋ค. ์ปดํ์ผ๋ฌ๋ ๋ณดํต ์๋ฌด ์ด์ ์์ด NaN์ ๋ฐ๋ช ํ ๋ค์ ๋ฒ๋ฆฌ์ง ์์ต๋๋ค.
๋น์ ์ด ๊ทธ๊ฒ์ ์ถ์ ํ๋ ค๊ณ ํ๋ค๋ฉด, ์๋ง๋ ๊ทธ ๋คํญ์์ ๋ํ ๊ณฑ์ ์ ๊ตฌํํ๋ ํ๋ช ํ ์ฝ๋๋ฅผ ๋ด์ผ ํ ๊ฒ์ ๋๋ค. ์ด์ํ ํ๋๊ทธ ์ค์ ์ด ํญ์ ์ผ์ด๋๊ณ ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. .
๋ํ numpy๊ฐ ๊ฐ์ฒด ๋ฃจํ์์ ์ด๋ฌํ ํ๋๊ทธ๋ฅผ ํ์ธํ๋ ค๊ณ ์๋ํ์ง ์์์ผํ๋ค๋ ๊ฝค ์ข์ ์ฃผ์ฅ์ด ์์ต๋๋ค. (๋๋ ๊ทธ ๋ฌธ์ ์ ๋ํ ์ ์ ๋ฃจํ์ด์ง๋ง, ์ ์ ์ค๋ฒํ๋ก๋ฅผ๋ณด๊ณ ํ๋ ๋ฐฉ์์ ๋ค์ ๋ณต์กํ๊ณ fpu ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊น๋ค ๋กญ์ต๋๋ค.) numpy๊ฐ ์ฌ๊ธฐ์ ํ ์์๋ ์ ์ผํ ์์ ์ ๋๋ค.
check_fpu()
์ ์คํ๊ฐ ์์ต๋๋ค. fvec = np.vectorize(f, excluded=exclude)
์ด์ด์ผํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ python2 : import functools32 as functools
์์ต๋๋ค.
functools.wraps
์๋ ํ์ด์ฌ 3์ด ํ์ํ์ง ์์ต๋๊น?
setattr()
ํธ์ถ์์ python2์ functools๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
AttributeError: 'method-wrapper' object has no attribute '__module__'
์, FPU ํ๋๊ทธ๋ฅผ ์ค์ ํ๋ ๊ฒ์ RealField
์ ๊ณ์์ ๋ํ ์ฐ์ ์ ๊ตฌํํ๋ ๋ค ์ ๋ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ๊ธฐ ๋ค๋ฅธ ์ํฉ์์ ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ numpy์ ๋์ผํ ์ปดํ์ผ๋ฌ๋ก ์ปดํ์ผ๋ฉ๋๊น? ์๋๋ฉด numpy ๋ง ๋ค๋ฅธ ์ปดํ์ผ๋ฌ๋ก ๋ค์ ๋น๋๋๊ณ ์์ต๋๊น?
์, RealField์ ๊ณ์์ ๋ํ ์ฐ์ ์ ๊ตฌํํ๋ ๋ค ์ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๊ฒ์ ๊ธฐ๋ก์์ํ MPFR์ ๋๋ค.
์ฐ๋ฆฌ๋ Sagemath๋ฅผ clang + gfortran (์ฃผ๋ก clang์ด ๊ธฐ๋ณธ ์ปดํ์ผ๋ฌ ์ธ ํ๋ซํผ ์ธ OSX ๋ฐ FreeBSD์์)์ผ๋ก ํฌํ ํ์ฌ OSX์์ ๋น๋ํ๊ณ ์คํํ๋ ๊ฒ์ด ๋ ์ฝ๊ณ ๋น ๋ฆ ๋๋ค (FreeBSD๋ OSX ๋ฐ Apple ํ๋์จ์ด์ ๋ฒ๊ฑฐ ๋ก์).
์ฌ๊ธฐ์๋ณด๊ณ ํ๋ ๋ชจ๋ ๋น๊ต๋ gcc / g +++ gfortran์ด ์๋ clang / clang +++ gfortran์ ์ฌ์ฉํ ์ ์ฒด ๋น๋์ ๋ํ ๊ฒ์ ๋๋ค.
๋ํผ๋ x.__rmul__
๊ฐ FPU ํ๋๊ทธ๋ฅผ ์ค์ ํ๋ค๊ณ ์๋ ค์ฃผ๋ ๊ฒ ๊ฐ์ต๋๋ค.
check_fpu(x.__rmul__)(np.float32('1.5'))
๊ฒฝ๊ณ ๋ฅผ ์ธ์ํ์ง๋ง x.__rmul__(np.float32('1.5'))
๋ ์ธ์ํ์ง ์์ต๋๋ค.
์ค์ ๋ก-๋ด ๊ฐ์ ์ x.__rmul__
๊ฐ ํ์ด์ฌ์ผ๋ก ์์ฑ๋์์ผ๋ฉฐ ์์ค ์ฝ๋๋ฅผ ์๋ถํ์ฌ ํ๋๊ทธ๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ์ค์ ํ๋ ๋นํธ๋ฅผ ์ฐพ์ ์ ์๋ค๊ณ ๊ฐ์ ํ์ต๋๋ค.
x.__rmul__
์ (๋) Cython์ ์์ง๋ง ์ฌ์ ํ ์กฐ์ฌํด์ผ ํ ์์ ์ฝ๋์
๋๋ค.
๊ฒฝ๊ณ ๋ฅผ ์ค๋ฅ๋ก ๋ณ๊ฒฝํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉด ํธ๋ ์ด์ค ๋ฐฑ์ ์ป์ ์ ์์ต๋๋ค (Cython์ ์ค๋ฅ์ ๋ํ ํธ๋ ์ด์ค ๋ฐฑ์ ์์ฑํ์ง๋ง ๊ฒฝ๊ณ ์ ๋ํด์๋ ์์ฑํ์ง ์์).
@jdemeyer IMHO numpy ๊ฒฝ๊ณ ๋ ์ฝ๋ ๊ฒฝ๋ก์์ ํจ์ฌ ๋์ค์ ๋ฐํ๋ฉ๋๋ค. ์ฆ, ์ธํฐ๋ฝํธ ์ธํธ๊ฐ ์๋ FPU ํ๋๊ทธ๋ฅผ ๋ช ์ ์ ์ผ๋ก ํ์ธํ ๊ฒฐ๊ณผ์ ๋๋ค.
numpy๋์ด ๊ฒฝ๊ณ ๋ฅผ ์ค๋ฅ๋ก ๋ณ๊ฒฝํ ์์๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ์ง๋ง, ์ญ ์ถ์ ์์ด ๊ธฐ๋ณธ iPython ์ธํฐํ๋ฆฌํฐ ๋ฃจํ๋ก ๋์๊ฐ๋ ๊ฒ๋ฟ์ ๋๋ค.
@jdemeyer ๋ FPU ํ๋๊ทธ๊ฐ ๋ฐ์ํ๋ฉด cysignals์ sig_on()
/ sig_off()
์ฌ์ด์ Cython ์ฝ๋์์ ์์ธ๊ฐ ๋ฐ์ํฉ๋๊น? ์๋๋ฉด ๊น๋ฐ์ ๋ฌ๋ ค ์์ต๋๊น?
cysignals๋ SIGFPE
๊ฐ ๋ฐ์ํ๋ฉด FPU ๊ตฌ์ฑ์ ๋ฐ๋ผ FPU ํ๋๊ทธ๊ฐ ๋ฐ์ํ๋ฉด ์์ธ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๋ ์ง ์์ต๋๋ค.
์ ์ฌํ ๊ฒฝ๊ณ : RuntimeWarning: invalid value encountered in greater
np.float64(5)>e
์์์ต๋๋ค. ์ฌ๊ธฐ์ e
๋ ์์ฐ ๋ก๊ทธ 2.71828 ...์ ๋ฐ์ ์ง์ ํ๋ Sagemath ์์์
๋๋ค. ๋ฐ๋ผ์ ์ด๊ฒ์ True
๋ก ํ๊ฐํ๋ ค๋ฉด "๋ณํ"ํด์ผํฉ๋๋ค (ํ์คํ e "์๊ณ "๊ทธ๊ฒ์ ์์น ๊ทผ์ฌ, ๊ทธ๊ฒ์ ์ซ์์ ๋ํ e.n()
)์
๋๋ค.
์ด ๊ทผ์ฌ์น๋ ์์์ ์ด๋ฏธ ์ธ๊ธ ํ RealField
์ ํ์
๋๋ค (๋ฐ๋ผ์์ด ๊ฒฝ๊ณ ๋ ๋ฐ์ ํ ๊ด๋ จ์ด ์์ต๋๋ค).
๋ค์ ํ ๋ฒ ์ง๋ฌธ์ numpy
๊ฐ np.float64(5)>e
๋ฅผ ํ๊ฐํ๊ธฐ ์ํด ๋ฌด์์ํฉ๋๊น?
๋๋ ๋์ผํ๊ฒ np.float64(5).__gt__(e)
์์ ๋์ผํ ๊ฒฝ๊ณ ๊ฐ ํ์๋๋ฏ๋ก ๊ฑฐ๊ธฐ์์ ์์ํ ์๋ ์์ต๋๋ค.
type(e)
๋ sage.symbolic.constants_c.E
. ๊ธฐ๋ณธ์ ์ผ๋ก (๊ฑฐ์) ๋๋ฏธ ํด๋์ค์
๋๋ค.
Sagemath์ ๊ธฐํธ ํํ์ ( SR
) ๋ํ.
np.float64(5).__gt__(e.n())
๋๋ np.float64(5)>e.n()
๊ฒฝ๊ณ ๊ฐ ์์ต๋๋ค.
e
๋ฅผ pi
(๋ช
๋ฐฑํ pi.n()==3.1.415...
)๋ก ๋ฐ๊พธ๋ฉด ๋ณธ์ง์ ์ผ๋ก ๋์ผํ (๊ฐ์ ๊ฒฝ๊ณ / ๊ฒฝ๊ณ ํจํด ์์)์ด ๋ฐ์ํฉ๋๋ค.
pi
์ ํ์ SR
, ์ฆ sage.symbolic.expression.Expression
์
๋๋ค.
๋๋ต์ ์ฌ๊ธฐ์์ ๋์ผํฉ๋๋ค-numpy๋ ๊ฐ์ฒด ๋ฃจํ๋ก np.greater
๋ฅผ ํธ์ถํฉ๋๋ค. ํ๋จ ์์ค์์ e.__lt__(5.0)
๋ฅผ ํธ์ถํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ค์ ํ ๋ฒ ์ด์ ๊ณผ ์ดํ์ FPU ํ๋๊ทธ๋ฅผ ํ์ธํ๊ณ ๋ฌด์ธ๊ฐ ์๋ชป๋์์์ ์ ์ ์์ต๋๋ค.
๋๋ถ๋ถ์ ndarray ์ฐ์ / ๋
ผ๋ฆฌ ์ฐ์ฐ์ ( -
๋ฐ divmod
์ ์ธ)๋ ufuncs์ ์์ํฉ๋๋ค. sage ๊ฐ์ฒด์ ํจ๊ป ํธ์ถ๋๋ฉด ์ด๋ฌํ ufuncs์ ๋ํด O
(๊ฐ์ฒด) ๋ฃจํ๋ฅผ ํธ์ถํฉ๋๋ค. ์ด๋ฌํ ๊ฐ์ฒด ๋ฃจํ๋ ๋ฐฐ์ด (์ด ๊ฒฝ์ฐ 0d)์ ๋ฐ๋ณตํ๊ณ ์์์์ ์ผ๋ฐ ํ์ด์ฌ ์ฐ์ฐ์๋ฅผ ์คํํ๊ณ _ํ์ง๋ง ๊ทธ๋ ๊ฒ ํ ๋ FPU ํ๋๊ทธ๋ฅผ ํ์ธํฉ๋๋ค _.
๋ค์ ํ ๋ฒ ์ธ์ด์ง๊ฐ์ด ํ๋๊ทธ๋ฅผ ์ค์ ํ๊ณ ์์ต๋๋ค. ์๋ง๋ ์ด๊ฒ์ ๋ฒ๊ทธ์ ์งํ ์ผ ์๋ ์๊ณ ์๋ ์๋ ์์ต๋๋ค.
numpy๊ฐ ์ด๋ฌํ ๊ฒฝ์ฐ์ fpu ํ๋๊ทธ๋ฅผ ํ์ธํ์ง ์์์ผํ๋ค๋ ์ข์ ์ฃผ์ฅ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. @njsmith , ๊ฐ์ฒด ์ ํ ๊ฒ์ฌ๋ฅผ ์ ๊ฑฐํด์ผํ๋ค๊ณ ์๊ฐํ์ญ๋๊น?
์ฌ์ค e.__lt__(5.0)
๋ ๊ธฐํธ ํํ์์
๋๋ค.
sage: type(e.__lt__(np.float32(5.0)))
<type 'sage.symbolic.expression.Expression'>
sage: e.__lt__(np.float32(5.0))
e < 5.0
sage: bool(e.__lt__(np.float32(5.0))) # this is how it's evaluated
True
๊ทธ๋์ ๋๋ ๊ทธ๊ฒ์ด True
์ป์ ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ ๊ทธ๊ฒ์ด ํธ์ถ๋์๋์ง ์ ๋ง๋ก ์์ฌํฉ๋๋ค. ๋ํ ์์ check_fpu
๋ํผ๋ ๊ฒฝ๊ณ ๋ฅผ ์ธ์ํ์ง ์์ต๋๋ค. ์ฆ, ๋ค์์ด ์๋ํฉ๋๋ค.
sage: check_fpu(e.__lt__)(np.float32(5.0))
e < 5.0
๋๋ Sagemath์ ๋ฌธ์ ๋ฅผ fpectl Python ๋ชจ๋์ ์ฌ์ฉํ์ฌ ํน์ C ํ์ฅ์ ๊ณ ์ ํ ์์์์ต๋๋ค. ์ค์ ๋ก ์ค์น๊ฐ ์๋ฃ๋๋ฉด ๋งค์ฐ ๋นจ๋์ต๋๋ค.
IMHO fpectl์ ๋งค์ฐ ์ ์ฉํ์ฌ ์์ ํด์ผํฉ๋๋ค. ์๋ง๋ np.seterr()
๋์ ๋๋ ์ถ๊ฐ๋ก numpy์์ ์ฌ์ฉ๋์์ ์๋ ์์ต๋๋ค. ์ปดํ์ผ ๋ ๊ตฌ์ฑ ์์์ ๋ํด ๋ ๋์ ์ธ๋ถ์ฑ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์
๋๋ค.
fpectl์ ์ ๊ทผ ๋ฐฉ์๊ณผ np.seterr์ ์ฐจ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
np.seterr
๋ ufunc ๋ฃจํ๋ฅผ ์คํ ํ ๋ค์ ํ๋๊ทธ๊ฐ ์ค์ ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
fpectl
ํ๋๊ทธ ์ค ํ๋๋ฅผ ์ค์ ํ๋ ์์
์ด ๋ฐ์ํ ๋๋ง๋ค ํ๋์จ์ด๊ฐ ์ธํฐ๋ฝํธ๋ฅผ ๋ฐ์์ํค๊ณ ์ปค๋์ด์ด๋ฅผ ํ๋ก์ธ์ค์ ์ ๋ฌ ๋ SIGFPE๋ก ๋ณํํ๊ณ longjmp
์ ํธ ์ฒ๋ฆฌ๊ธฐ์์ ์ง์ ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋๋ก ๋ค์ด๊ฐ๋ SIGFPE ์ฒ๋ฆฌ๊ธฐ.
fpectl
์ ๊ทผ ๋ฐฉ์์ ๋ช ๊ฐ์ง ๋จ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. (a) Windows์์ ์ ํ ์๋ํ์ง ์์ต๋๋ค. (b) ๋ด๋ถ์ ์ผ๋ก ์ด๋ฌํ ํ๋๊ทธ ์ค ํ๋๋ฅผ ์ผ์์ ์ผ๋ก ์ค์ ํ ๋ค์์ด๋ฅผ ์ง ์๋๋ค. ํฉ๋ฒ์ ์ด๋ฉฐ ๊ทธ๋ ๊ฒํ๋ libm์ด์์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.), (c) longjmp
๋ ์์ฒญ๋๊ฒ ์ทจ์ฝํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋น์ ์ ๊ทธ๊ฒ์ ํ ๋๋ง๋ค ์ธ๊ทธ ํดํธ ์ํ์ ๊ฐ์ํ๊ณ ์์ต๋๋ค. ์์์ ์ฌ์ฉ์ ์ ์ ufunc์ ๋ํ ์ผ๋ฐ์ ์ธ ์๋ฃจ์
์ด ๋ ์๋ ์์ต๋๋ค.
์ด ๋ชจ๋ ๊ฒ์ ๊ฐ์ํ ๋ numpy๊ฐ ์ ํ๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด์จ๋ ์๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฌ๋ฏ๋ก์ด ๋ฌธ์ ๋ฅผ ์ข
๋ฃํฉ๋๋ค. seterr
์์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ์ผ์ด์ค๋ฅผ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ์ธ์ ๋ ์ง ์ ๋ฌธ์ ๋ฅผ ์ด โโ์ ์์ต๋๋ค.
์ด์จ๋ ์๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฐ์ฒด ๋ฃจํ์ ๋ํ FPU ํ๋๊ทธ ๊ฒ์ฌ๋ฅผ ๋นํ์ฑํํ๊ณ ์ถ์ง ์์ต๋๊น? ๊ทธ๊ฒ์ numpy์ ๋ํ ๊ฝค ํ๋ช ํ ๋ณํ์ฒ๋ผ ๋ณด์ผ ๊ฒ์ ๋๋ค.
@ eric-wieser : ์ค, ๊ทธ๊ฑฐ ํฅ๋ฏธ๋ก์ด ์๊ฐ ์ด๋ค์. ์๋ง๋ ๊ทธ๊ฒ์ ๋ํ ๋ฌธ์ ๋ฅผ ์ฌ๋ ๊ฒ์ด ๊ฐ์น๊ฐ ์์ต๋๋ค :-). ํ์ง๋ง "์ฌ๋ฐ๋ฅธ ๊ฒ"์ ๋งค์ฐ ๋ณต์กํฉ๋๋ค. ์ด์์ ์ผ๋ก๋ ๊ฐ์ฒด dtype (์ฌ์ฉ์ dtype์ ์๊ฐํด๋ณด์ญ์์ค)์ ํน์ ์ผ์ด์ค๋ก ์ง์ ํด์๋ ์๋๋ฉฐ ์ ์ ๋ฃจํ๋์ด๋ฅผ ์ฌ์ฉํด์๋ ์๋ฉ๋๋ค (์ด๊ฒ์ ๊ฒ์ฌํ๋ ์ผ๋ถ ์ํคํ ์ฒ์์ ์ค์ ์ต์ ํ ์ผ ์ ์์ต๋๋ค / FPU ํ๋๊ทธ๋ฅผ ์ง์ฐ๋ ๊ฒ์ ๋งค์ฐ ๋๋ฆฝ๋๋ค), ๊ทธ๋ฌ๋ ์ ์ ๋ฃจํ๋ ์ ์ ์ค๋ฅ๋ฅผ ๋ช ์ ์ ์ผ๋ก ์ ํธํ๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค. ํ์ฌ๋ FPU ํ๋๊ทธ๋ฅผ ๋ช ์ ์ ์ผ๋ก ์ค์ ํ์ฌ ์ํํฉ๋๋ค. -๋งค๋ฌ๋ฆฐ ๊ณผ์ผ?
์๋๋ฉด ๋ด๊ฐ ์คํด๋ฅผํ๊ณ ํ์๋ ๋ฌธ์ ๋ฅผ ํ์ธํ์ ๋ฟ์ด๊ณ ์ค์ ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ ํ ์์ฒญ๋ ๋ณํ๊ฐ ํ์ํฉ๋๊น?
@njsmith : Windows์์ ์๋ํ์ง ์๋ ์ด์ ๋ฅผ ์ดํดํ ์ ์์ต๋๋ค. (๊ทธ๋ฌ๋ ์ด๊ฒ์ C99 ์ด์ ์๋์ ๋ง์ ๊ฒ์ ๋๋ค). ์ต์ FPU ์ฒ๋ฆฌ ํจ์ (fenv)๋ C ์ปดํ์ผ๋ฌ๊ฐ C99 ํ์ค์ ์ค์ํ๋ ์ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. fenv ์ธ์ ํ์ํ ๊ฒ์ setjmp / longjmp (๋ค์ ๋งํ์ง๋ง ํ์ค C ๊ธฐ๋ฅ)์ ๋๋ค.
๋ํ ์ ์์ ์ธ ์์
๊ณผ์ ์์ FE ์์ธ ์ค ํ๋๋ฅผ ๋ฐ์์ํค๋ libm์ ๋ํด ๋ฃ๊ณ ์ถ์ต๋๋ค.
(๋ฒ๊ทธ๋ก ๋ถ๋ฅ๋์ง ์๋ ํ).
@dimpase : C99์ ์ง์ ๋์ง ์์ SIGFPE ์ง์๋ ํ์ํฉ๋๋ค. (๊ธ์, C99๋ SIGFPE๊ฐ ์์ด์ผํ๋ค๊ณ ๋งํ์ง๋ง, ๊ทธ๊ฒ์ 0์ผ๋ก ๋๋๊ธฐ์ํ ๊ฒ์
๋๋ค. ๋ถ๋ ์์์ ์์ธ์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ง์ ํ์ง ์์ต๋๋ค.) ์ฆ, ์ ๊ฐ ์๋ชป ๊ธฐ์ต ํ ๊ฒ ๊ฐ์ต๋๋ค. MSVCRT๋ ์ ํธ๋ฅผ ์ง์ํ์ง ์๊ณ , MSVCRT๋ ๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ SIGFPE๋ฅผ ์๋ฎฌ๋ ์ดํธํ๊ณ , ํน์ fp ์์ธ์ ์ฌ์ฉํ ์ ์๋๋ก ๋นํ์ค _control_fp
ํจ์๋ฅผ ์ ๊ณตํ๋ฏ๋ก Windows ์ง์์ ์ค์ ๋ก ์ฅ๋ฒฝ์ด ์๋๋๋ค. OTOH longjmp
๋ ๋งค์ฐ ์ข์ ์ด์ ์์ด๋ ํ์คํ ์ผ์ด๋์ง ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ค์ง ์ค์ํ์ง ์์ต๋๋ค. :-)
๊ทธ๋ฆฌ๊ณ FWIW, libm์ด FE ์์ธ๋ฅผ ์ผ์ผํจ ๋ค์ ๋ค์ ์ง์ฐ๋ฉด ์ ๋ฒ๊ทธ๋ก ๊ฐ์ฃผํ๋์ง ์ ์ ์์ต๋๋ค. ๋๋ ๊ทธ๋ฌํ ๊ตฌํ์ด ์กด์ฌํ๋์ง ํ์ ํ์ง ๋ชปํ์ง๋ง ๊ทธ๋ด๋ฏํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ ์์๋ด๋ ๋ฐฉ๋ฒ์ ๋๊ตฐ๊ฐ๊ฐ ํ๋ซํผ X์์ numpy๊ฐ ๊ณ ์ฅ ๋ฌ๋ค๊ณ ์๋ ค์ฃผ๊ณ ์ ์ผํ ์์ ์ฌํญ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ ๋๋ฆฌ๋ ๊ฒ์ ๋๋ค. ๋น์ ์ด ์ ์ํ์ต๋๋ค.
์ด์ ๋๊ธ ๋์ ๋ด๊ฐ ๋ฌผ์ด ๋ณธ ์ง๋ฌธ์ ๋ตํ ์ ์์ต๋๊น?
@njsmith : libm (๋๋ ๋ค๋ฅธ ์ฌ์ฉ์ ์ฝ๋)์ด FE ์์ธ๋ฅผ ๋ฐ์์ํค๊ณ ์ฒ๋ฆฌํด์ผํ๋ ๊ฒฝ์ฐ ์์ฒด FE ์์ธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ค์ ํ๊ณ ์ด์ ์์ธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ ์ฅํ๊ณ ์ข
๋ฃ์ ์ด์ ์์ธ๋ฅผ ๋ณต์ํฉ๋๋ค.
๋ฐ๋ผ์ ๊ธฐ๋ณธ ์ฝ๋๊ฐ ๊ท์น์ ๋ฐ๋ผ ์๋ํ๋ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ๋์ง ์์ต๋๋ค.
์ด์ ๋ํ MS ์ง์๊ณผ ๊ด๋ จํ์ฌ Visual C (++) 2013 ์ดํ๋ก fenv.h๋ฅผ ์ ๊ณต ํฉ๋๋ค.
๊ทธ๊ฒ์ ํนํ setjmp / longjmp์ ํจ๊ป ์ ์ฉํ๊ฒ ์ฌ์ฉํ๊ธฐ์ํ ๊ฒ์
๋๋ค.
numpy์ RuntimeWarning๊ณผ ๊ด๋ จํ์ฌ :
fpectl
๋ ํ์๋ฅผ ๋ฌ์ฑํ๋ ๋น ๋ฅธ ๋ฐฉ๋ฒ์
๋๋ค. ์ธ๋ถ ๋๊ตฌ (์ : ๋ชจ๋ ๋ช
๋ น์ด๋ฅผ ํ์ธํ ๋ ์ฝ๋๋ฅผ ๊ณ์ธก ํ ์ ์๋๋กํ๋ ๋๋ฒ๊ฑฐ)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ ์ด๋ ต๊ณ ๋๋ฆฌ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค. ๋๋ฒ๊น
์ด ๊ฐ๋ฅํ ๋ฐ์ด๋๋ฆฌ์์ ์ฐพ์ผ๋ ค๊ณ ํ๋ฉด ์ฆ์ ์ฌ๋ผ์ง๋๋ค.Sage์์ด ๋ฌธ์ ์ ๊ด๋ จํ์ฌ-์ฌ์ ํ ์์ ์ค์ ๋๋ค ( MPFR์ ์ผ๋ถ ๋ฌธ์ ๋ก๋ง ์ ํ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค).
์ฃ์กํฉ๋๋ค. ์ด๊ฒ์ ์์ผ๋ก ์งํ๋๊ณ ์์ผ๋ฉฐ ๋ค๋ฅธ ์์ ์ผ๋ก ๋์ด ๊ฐ์ผํฉ๋๋ค. fenv / sigfpe ๋ฌธ์ ์ ๋ํด ์๋ก์ด ๊ฒ์ด ๋์ค์ง ์๋ ํ ์ด๊ฒ์ด ์ฃผ์ ์ ๋ํ ๋ง์ง๋ง ๋ฉ์์ง๊ฐ ๋ ๊ฒ์ ๋๋ค. (์ธ์ด์ง ๋ฒ๊ทธ์ ๋ํด numpy ๊ฐํด ์ผ ํ ์ผ์ด ์๋์ง ์ฌ์ ํ ๊ด์ฌ์ด ์์ต๋๋ค.)
libm (๋๋ ๋ค๋ฅธ ์ฌ์ฉ์ ์ฝ๋)์ด FE ์์ธ๋ฅผ ๋ฐ์์ํค๊ณ ์ฒ๋ฆฌํด์ผํ๋ ๊ฒฝ์ฐ ์์ฒด FE ์์ธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ค์ ํ์ฌ ์ด์ ์์ธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ ์ฅํฉ๋๋ค.
๋น์ ์ด ์ ์ํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ ํธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์คํํ์ง ์๋ ์์ ์ ์ํํ๊ณ ์ ํธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์คํํ๋ ๋นํ์ค ๋ชจ๋์์ ํ๋ก์ธ์๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ ๋๋ค. ์ฝ๋๊ฐ์ด ์์ ์ ์ํํ๊ณ ์ ํธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ ํ ํธ๋ฆฌ๊ฑฐํ์ง ์์ ๊ฒ์ผ๋ก ์์ํ๋ ๊ฒ์ ์ ์ ์ผ๋ก ํฉ๋ฆฌ์ ์ ๋๋ค.
์ด์ ๋ํ MS ์ง์๊ณผ ๊ด๋ จํ์ฌ Visual C (++) 2013 ์ดํ๋ก fenv.h๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํนํ setjmp / longjmp์ ํจ๊ป ์ ์ฉํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ฌด์จ ๋ง์ํ๋์ง ๋ชจ๋ฅด๊ฒ ๋ค์. fenv.h์ ํ์ค ๊ธฐ๋ฅ์ธ Afaict๋ numpy ์คํ์ผ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐ๋ง ์ ์ฉํ๋ฉฐ MS๋ ํ์ค์ ๊ณ ์ํฉ๋๋ค. setjmp / longjmp์ ํจ๊ป ์ฌ์ฉํ ์์๋ ํจ์๊ฐ ์ ํ ๋ณด์ด์ง ์์ต๋๋ค.
์ฌ์ฉ์ ์ฝ๋๋ FP ํ๋๊ทธ๋ก ๋น ๋ฅด๊ณ ๋์จํ๊ฒ ์ฌ์ํ ์ ์์ผ๋ฉฐ ์ด๋ฌํ ๊ฒฝ๊ณ ๋ ๊ธฐ๊ปํด์ผ ์ ํ ์ฌํญ์ ๋๋ค.
์ค๊ฐ ๊ณ์ฐ์ ์ํด ์ค์ ๋ ํ๋๊ทธ๋ฅผ ์กฐ์ฌ์ค๋ฝ๊ฒ ์ง์ฐ๋ ๊ฒ์ ๋น ๋ฅด๊ณ ๋์จํ๊ฒ ํ๋ ์ดํ๋ ๊ฒ๊ณผ ์ ๋ฐ๋์ ๋๋ค. ๋ํ ๊ฒฝ๊ณ ๋ ์ ํ ์ฌํญ์ ๋๋ค.
๊ทธ๋ค์ด ์จ ๊ณณ์ ๋ฐ๋ฅ์ ๋๋ฌํ๋ ๋ฐฉ๋ฒ์ ๊ทธ๋ค์ด ์ ์ฉํ๊ธฐ ์ํด ๋งค์ฐ ์ค์ํฉ๋๋ค. (๊ฐ์ ๋จ) fpectl์ ํ์๋ฅผ ๋ฌ์ฑํ๋ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ ๋๋ค.
๋น์ ์ ๋ง ๊ทธ๋๋ก 10 ๋ ๋ง์ ์ด๋ฐ ์ข ๋ฅ์ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ๊ธฐ ์ํด SIGFPE๊ฐ ํ์ํ ์ต์ด์ ์ฌ๋์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ์ด์ง ๋ฒ๊ทธ ๋๊ธ์ ๋ค์ ์ดํด๋ณด๋ฉด ์ค์ ๋ก fpectl์ด ์๋ํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์ฝ์ด ๋คํ๋ฅผ ์ ๋ฐํด์๋ ์๋ฉ๋๋ค. (cysignals๊ฐ fpectl ์ฝ๋๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ์คํ๋์ง๋ ์์ต๋๋ค.)
์ด ๋ฌธ์ ๊ฐ ๋ค์ ๋ฐ์ํ๋ฉด ํ ๋ฒ์ C ํธ์ถ์ ์ํํ์ฌ SIGFPE๋ฅผ ํ์ฑํ ํ ๋ค์ ๋๋ฒ๊ฑฐ๋ฅผ ์ฌ์ฉํ์ฌ ์คํ ์ถ์ ์ ๊ฐ์ ธ์ต๋๋ค. ์คํ ์ถ์ ์ ์ป๊ธฐ ์ํด ๋๋ฒ๊ทธ ๋น๋๊ฐ ํ์ํ์ง ์์ต๋๋ค. ๊ธฐํธ๋ฅผ ์ ๊ฑฐํ์ง ์์ผ๋ฉด๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ด ๋ค์ ๋ฐ์ํ ๊ฒฝ์ฐ๋ฅผ ์๊ณ ์์ต๋๋ค.
๋๋ฒ๊น
์ด ์ ๋ง ํ๋ค๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค.ํ์ง๋ง ์ด๊ฒ์ด ๋ฌด์์ ์ฑ์ทจ ํ ๊ฒ์ธ์ง ๋ช
ํํ๊ฒ ์ค๋ช
ํ ์์๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ํ๋ก์ ํธ๊ฐ ๊ธฐ๋ณธ ์ธํ๋ผ๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ ์งํด์ผํ๋ค๊ณ ์ฃผ์ฅํ๋ ๊ฒ์ ๋์์ด๋์ง ์์ต๋๋ค. (์ค์ ๋ก ์ฌ๊ธฐ์ numpy๊ฐ ๋ญ๊ฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์ด๋ฐ ์ข
๋ฅ์ ๋ฒ๊ทธ๋ฅผ ๋ ๋นจ๋ฆฌ ์ฐพ๋ ๋ฐ ์ด๋ป๊ฒ ๋์์ด๋๋ค๊ณ ์๊ฐํ๋์ง ์ ํ ๋ชจ๋ฆ
๋๋ค. longjmp
์ ์ ์ฒด ์์ด๋์ด๋ ์ฌ์ฉ์๊ฐ ์ํ๋ ๋ ์ ํํ ์ ๋ณด๋ฅผ ํ๊ดดํ๋ ๊ฒ์
๋๋ค.)
๋ง์ง๋ง์ผ๋ก clang C ์ปดํ์ผ๋ฌ์ ์ค๋ ๋ฒ๊ทธ ๋ก ๊ท๊ฒฐ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก double
์ ํน์ ๋ฒ์์์ ํ ๋น์
unsigned long a;
double b;
...
a = b;
FE_INVALID
๋ชจ๊ธ (๋๋ก๋ FE_INEXACT
); btw ์ด๊ฒ์ ๋ค๋ฅธ ์ ํ์ float ๋ฐ์ดํฐ์๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ํ๋ฅญํ MPFR (MPFR์ ์์์ ์ ๋ฐ๋ ๋ถ๋ ์์์ ์ double์ ๋ณต์ฌํด์ผ ํจ) ์ฌ๋๋ค์ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ํ๋ช
ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
๋ง๋ถ์ฌ์, ๊ด๋ จ ํจ์ฌ ๋ ์ค๋ ์ง์๋๋ (2010 ๋
์ดํ๋ก 12 ๊ฐ์ ๋ซํ ์ค๋ณต์ด ์์) clang ๋ฒ๊ทธ 8100 ์ clang์ fenv.h
๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ fpectl
์ ๋๋ก ์๋์ํฌ ํฌ๋ง์ด ์๋ค๊ณ ๋งํฉ๋๋ค. . Clang์์ด ์ ์์ C99๋ฅผ ์์ ํ ์ค์ํ์ง ์์ผ๋ฉฐ ์ ๋ง ๋ถ๋๋ฌ์ํฉ๋๋ค.
numpy
์ด (๊ฐ) ๊ทธ๊ฒ์ ๋ํด ๋ฌด์์ด๋ ํ ๊ฒ์ธ์ง ํ์คํ์ง ์์ต๋๋ค. RuntimeWarning
๊ฐ ๋จ์ง ์ปดํ์ผ๋ฌ ๋ฒ๊ทธ ๋๋ฌธ์ผ ์ ์๋ค๋ ์ธ๊ธ ( "clang bug 8100"์ ์ธ์ฉํ๋ฉด ๋งค์ฐ ๋์ ๋๋ ์์)์ด ๋์์ด ๋ ์ ์์ต๋๋ค.
๋ฒ๊ทธ 8100์ ๊ด๋ จ์ด ์์ต๋๋ค. ์ด๋ C99 pragma๊ฐ ๋ถ๋ ์์์ ์ต์ ํ๋ฅผ ๋นํ์ฑํํ๋ ๊ฒ์ด๋ฉฐ, ์ฃผ๋ฅ ์ปดํ์ผ๋ฌ๋์ด๋ฅผ ์ง์ํ์ง ์์ต๋๋ค. numpy๋ ์ด์จ๋ (๋๋ถ๋ถ) ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค :-)
๋ฒ๊ทธ 8100์ ์ ์ ์ clang์ด FP ์์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ปดํ์ผ๋๋ ๊ฒ์ ์ ๊ฒฝ ์ฐ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ณํธ์ฌ๋ ๋์ํ์ง ์์ ์ ์์ต๋๋ค. :-)
์ข์, ์ด๋ฏธ ์ธ๊ธ ํ ๋ฒ๊ทธ 17686 ์ ํ์คํ ๊ด๋ จ์ด ์์ต๋๋ค.