Numpy: clang-compiled np.float32 .__ mul__์— ์˜ํ•œ ๋ฌด์˜๋ฏธํ•œ RuntimeWarning

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

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์—์„œ๋„ ์ด๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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๊ณผ ๊ด€๋ จํ•˜์—ฌ :

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

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 ์€ ํ™•์‹คํžˆ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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