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ã®å€éšã§çºè¡ãããå¯èœæ§ããããŸãã OSX 11.12ãšãã®ã¹ããã¯ccïŒclang 3.8ã®æŽŸçç©ïŒãLinuxãšclang 4.0ãFreeBSD11.0ãšclang4.0ãŸãã¯clang3.7ã§åçŸã§ããŸãã
Sagemathã®å€éšã§ãããåçŸããæ¹æ³ãäœæã§ããå¯èœæ§ããããŸãããxã«é©çšãããé¢æ°ã確èªããããã«ãnumpyã³ãŒãã§ãã®__mul__
ãå®éã«å®è£
ãããŠãããã³ããå¿
èŠã§ã...
ããã¯numpy1.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ã«èšå®ãããŠããŸãããsageã³ãŒãå ã®gccã«ã¯èšå®ãããŠããªãããã§ãã Numpyã¯ããã«ã€ããŠéšãããšã®ããã§ããããããããããèšå®ããããšã®ããã§ã¯ãªãããšç§ã¯åŒ·ãçã£ãŠããŸãã
æ®å¿µãªããã numpy
ã¯ãFPUãã©ã°ãæ瀺çã«èŠæ±ããæ¹æ³ãå
¬éããŠããŸãããããã¯ãsageå
ã§åé¡ãäºåããã®ã«éåžžã«åœ¹ç«ã¡ãŸãã
ç§ã¯ãããåãèŠåãåŒãèµ·ãããšæããŸãïŒããããããã«numpy1.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)
OKãããã§ãããããã¯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ãçºæããŠç Žæ£ããããšã¯ãããŸããã
ããã远跡ããããšããŠããå Žåã¯ããããããããã®å€é åŒã®ä¹ç®ãå®è£ ããsageã®ã³ãŒãã確èªããå¿ èŠããããŸãããããããå¥åŠãªãã©ã°èšå®ãåžžã«è¡ãããŠããå¯èœæ§ããããnumpyã®å¯äžã®é¢äžã¯ããã衚瀺ããããšã§ãã ã
numpyããªããžã§ã¯ãã«ãŒãã§ãããã®ãã©ã°ããã§ãã¯ããããšãããã¹ãã§ã¯ãªããšããããªãè¯ãè°è«ããããŸãã ïŒãŸãã¯ãæŽæ°ã«ãŒãã§ãããæŽæ°ãªãŒããŒãããŒãå ±åããæ¹æ³ã¯ããç²éã§ãfpuãã©ã°ã䜿çšããããã泚æãå¿ èŠã§ããïŒnumpyãããã§å®è¡ã§ããã®ã¯ããã ãã§ãã
check_fpu()
ã«ã¯ã¿ã€ããã¹ãããã fvec = np.vectorize(f, excluded=exclude)
ããå¿
èŠããããŸãã
ãããŠãç§ãã¡ã¯python2ã䜿çšããŠããŸãïŒ import functools32 as functools
ã
functools.wraps
ã¯Python 3ãå¿
èŠãšããŸãããïŒ
setattr()
åŒã³åºãã§python2ã®functoolsã䜿çšãããšããšã©ãŒãçºçããŸã
AttributeError: 'method-wrapper' object has no attribute '__module__'
ãããFPUãã©ã°ãèšå®ããŠããã®ã¯RealField
ã®ä¿æ°ã®ç®è¡æŒç®ãå®è£
ããŠããå€åé·ã©ã€ãã©ãªã ãšæããŸãã åºç€ãšãªãã©ã€ãã©ãªã¯ãããŸããŸãªç¶æ³ã®ããããã§numpyãšåãã³ã³ãã€ã©ã§ã³ã³ãã€ã«ãããŠããŸããïŒ ãããšããnumpyã ããå¥ã®ã³ã³ãã€ã©ã§åæ§ç¯ãããŠããŸããïŒ
ãããRealFieldã®ä¿æ°ã®ç®è¡æŒç®ãå®è£ ããŠããå€ç²ŸåºŠã©ã€ãã©ãªãªãäœã§ããããšæããŸã
ããã¯èšé²ã®ããã®MPFRã§ãã
Sagemathãclang + gfortranïŒäž»ã«OSXãšFreeBSDãclangããã©ã€ããªã³ã³ãã€ã©ã§ãããã©ãããã©ãŒã ïŒã«ç§»æ€ããŠã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__
ãPythonã§æžãããŠããããã®ãœãŒã¹ã³ãŒããäºåããŠãã©ã®ãããããã©ã°ãå
·äœçã«èšå®ããŠããããèŠã€ããããšãã§ãããšãããã®
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
ã§ãïŒãããã£ãŠããã®èŠåã¯å¯æ¥ã«é¢é£ããŠããå¯èœæ§ããããŸãïŒã
ç¹°ãè¿ããŸãããåé¡ã¯ã np.float64(5)>e
ãè©äŸ¡ããããã«numpy
ã¯äœãããã®ããšããããšã§ãã
ãŸãã¯åçã«ãåãèŠåã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ã«å§ä»»ããŸãã ã»ãŒãžãªããžã§ã¯ãã§åŒã³åºããããšããããã®ufuncã«å¯ŸããŠO
ïŒãªããžã§ã¯ãïŒã«ãŒããåŒã³åºãããŸãã ãããã®ãªããžã§ã¯ãã«ãŒãã¯é
åïŒãã®å Žåã¯0dïŒãã«ãŒãããèŠçŽ ã«å¯ŸããŠéåžžã®pythonæŒç®åãå®è¡ããŸãããå®è¡ããå Žåã¯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
fpectl Pythonã¢ãžã¥ãŒã«ïŒFreeBSDã§ã¯å®å šã§ã¯ãããŸãããå€å°å£ããŠããŸãïŒã䜿çšããŠãSagemathã®åé¡ãç¹å®ã®Cæ¡åŒµæ©èœã«ç¹å®ããããšãã§ããŸããã ãªããšãã€ã³ã¹ããŒã«ã§ããããå®ã¯ãšãŠãéãã£ãã§ãã
IMHO fpectlã¯éåžžã«äŸ¿å©ãªã®ã§ãä¿®æ£ããå¿
èŠããããŸãã ã³ã³ãã€ã«ãããã³ã³ããŒãã³ãã®ç²åºŠãåäžããããã np.seterr()
代ããã«ããŸãã¯
fpectlã®ã¢ãããŒããšnp.seterrã®éãã¯æ¬¡ã®ãšããã§ãã
np.seterr
ã¯ufuncã«ãŒããå®è¡ãããã©ã°ãèšå®ãããŠãããã©ããã確èªããŸãã
fpectl
ã¯ããã©ã°ã®1ã€ãèšå®ãããæäœãçºçãããã³ã«ãããŒããŠã§ã¢ãå²ã蟌ã¿ãçºçãããã«ãŒãã«ããããããã»ã¹ã«é
ä¿¡ããã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äŸå€ã®1ã€ãåŒãèµ·ããlibmã«ã€ããŠèããŠã¿ãããšæããŸãã
ïŒãã°ãšããŠåé¡ãããŠããªãéãïŒã
@dimpase ïŒC99ã§æå®ãããŠããªãSIGFPEãµããŒããå¿
èŠã§ãã ïŒãŸããC99ã¯SIGFPEãããã¹ãã ãšèšã£ãŠããŸãããããã¯ãŒãé€ç®ã®ããã§ãâæµ®åå°æ°ç¹äŸå€ã«ããã¯ããæ¹æ³ãæå®ããŠããŸãããïŒãšã¯ãããç§ã¯èŠããŠããªãã£ãããã§ãããWindowsã¯ã·ã°ãã«ããµããŒãããŠããŸãããMSVCRTã¯æ§é åäŸå€åŠçã䜿çšããŠSIGFPEããšãã¥ã¬ãŒãããç¹å®ã®fpäŸå€ã«å¯ŸããŠãããæå¹ã«ããéæšæºã®_control_fp
é¢æ°ãæäŸãããããWindowsãµããŒãã¯å®éã«ã¯éå£ã§ã¯ãããŸããã OTOH longjmp
ã¯éåžžã«æ£åœãªçç±ããªããã°çµ¶å¯Ÿã«èµ·ãããªãã®ã§ãããã»ã©éèŠã§ã¯ãããŸãã:-)
ãããŠFWIWãlibmãFEäŸå€ãåŒãèµ·ããããããåã³ã¯ãªã¢ããå Žåããªã圌ããããããã°ãšèŠãªãã®ãããããŸããã ãã®ãããªå®è£ ãååšãããã©ããã¯ããããŸããããããã¯ãã£ãšããããã§ãããããŠããããååšããå Žåãç§ãã¡ãèŠã€ããæ¹æ³ã¯b / cã§ã誰ãããã©ãããã©ãŒã Xã§numpyãå£ããŠãããšç§ãã¡ã«èšããŸããããŠå¯äžã®ä¿®æ£ã¯å€æŽãå ã«æ»ãããšã§ãããªããææ¡ããã
以åã®ã³ã¡ã³ãã®æåŸã«ç§ãå°ãã質åã«çããŠããããŸããïŒ
@njsmith ïŒlibmïŒãŸãã¯ãã®ä»ã®ãŠãŒã¶ãŒã³ãŒãïŒãFEäŸå€ãçºçãããŠåŠçããå¿
èŠãããå Žåãç¬èªã®FEäŸå€ãã³ãã©ãŒãèšå®ããåã®äŸå€ãã³ãã©ãŒãä¿åããŠãçµäºæã«åã®äŸå€ãã³ãã©ãŒã埩å
ããŸãã
ãããã£ãŠãåºç€ãšãªãã³ãŒããã«ãŒã«ã«åŸã£ãŠåçãããŠããŠãåé¡ã¯ãããŸããã
ããã«å¯ŸããMSã®ãµããŒãã«é¢ããŠã¯ãVisual CïŒ++ïŒ2013以éããfenv.hãåºè·ãããŠããŸãã
ããã¯ç¹ã«setjmp / longjmpã§åœ¹ç«ã€ããšãæå³ããŠããŸãïŒå
éšã§ã©ã®ããã«æ£ç¢ºã«è¡ããããã¯ãããã»ã©å¿é
ããå¿
èŠã¯ãããŸãããç§ã¯é¡ã£ãŠããŸãïŒã
numpyã®RuntimeWarningã«ã€ããŠïŒ
fpectl
ã¯ãåŸè
ãå®çŸããããã®ç°¡åãªæ¹æ³ã§ãã å€éšããŒã«ïŒãã¹ãŠã®åœä»€ã®åŸã«äœãããã§ãã¯ããããã«ã³ãŒããã€ã³ã¹ãã«ã¡ã³ãåã§ããããã¬ãŒãªã©ïŒã䜿çšããããšã¯ãããé£ãããé
ãããšã©ãŒãçºçãããããªããŸã---ããšãã°ããã°ãæé©åããããã€ããªã§ã®ã¿ãããã¢ããããããšã¯çããããšã§ã¯ãããŸãããååã«ãããã°å¯èœãªãã€ããªã§ãããèŠã€ããããšãããšããã«æ¶ããŸããSageã®ãã®åé¡ã«é¢ããŠ-ãŸã ä¿®æ£äžã§ãïŒããŸãããã°ã MPFRã®ããã€ãã®åé¡ã«éå®ãããŸãïŒã
ç³ãèš³ãããŸããããããã¯èŒªã«ãªã£ãŠããŠãä»ã®ããšã«ç§»ãå¿ èŠãããã®ã§ãfenv / sigfpeã®åé¡ã§äœãæ°ããããšãèµ·ãããªãéããããããã®ãããã¯ã«é¢ããç§ã®æåŸã®ã¡ãã»ãŒãžã«ãªããŸãã ïŒè³¢è ã®ãã°ã®ããã«numpyãããå¿ èŠãããããšããããã©ããç§ã¯ãŸã èå³ããããŸãïŒã
libmïŒãŸãã¯ä»ã®ãŠãŒã¶ãŒã³ãŒãïŒãFEäŸå€ãçºçãããŠåŠçããå¿ èŠãããå Žåãlibmã¯ç¬èªã®FEäŸå€ãã³ãã©ãŒãã»ããã¢ããããåã®ãã³ãã©ãŒãä¿åããŸãã
ããªããææ¡ããŠããã®ã¯ãéåžžã¯ã·ã°ãã«ãã³ãã©ãŒãèµ·åãããªãæäœãå®è¡ããã·ã°ãã«ãã³ãã©ãŒãèµ·åãããéæšæºã¢ãŒãã§ããã»ããµãæ§æããããšã§ãã ã³ãŒãããã®æäœãå®è¡ããã·ã°ãã«ãã³ãã©ãŒããŸã£ããããªã¬ãŒããªãããšãæåŸ ããããšã¯å®å šã«åççã§ãã
ããã«å¯ŸããMSã®ãµããŒãã«é¢ããŠã¯ãVisual CïŒ++ïŒ2013以éããfenv.hãåºè·ãããŠããŸãã
ããã¯ãsetjmp / longjmpã§åœ¹ç«ã€ããšãç¹ã«æå³ããŠããŸãã
ããªããããã§äœã«ã€ããŠè©±ããŠããã®ãç解ã§ããŸããã Afaictãfenv.hã®æšæºæ©èœã¯ãnumpyã¹ã¿ã€ã«ã®æ©èœãå®è£ ããå Žåã«ã®ã¿åœ¹ç«ã¡ãMSã¯æšæºã«æºæ ããŠããŸãã setjmp / longjmpã§äœ¿çšã§ããé¢æ°ã¯ãŸã£ãããããŸããã
ãŠãŒã¶ãŒã³ãŒãã¯FPãã©ã°ã䜿çšããŠé«éãã€ç·©ãåçã§ããããããããã®èŠåã¯ãããããªãã·ã§ã³ã§ããå¿ èŠããããŸãã
äžéèšç®ã«ãã£ãŠèšå®ããããã©ã°ã泚ææ·±ãã¯ãªã¢ããããšã¯ããããããã°ããç·©ããã¬ã€ããããšãšã¯æ£å察ã§ãã ãŸããèŠåã¯ãªãã·ã§ã³ã§ãã
圌ããç±æ¥ããå Žæã®åºã«å°éããæ¹æ³ã¯ã圌ããæçšã§ããããã«éèŠã§ãã ïŒæ¹åãããïŒfpectlã¯ãåŸè ãå®çŸããããã®è¿ éãªæ¹æ³ã§ãã
ããªãã¯æåéãããã®çš®ã®åé¡ããããã°ããããã«SIGFPEãå¿ èŠãšãã10幎ã»ã©ã®æåã®äººã§ãããããŠãè³¢æãªãã°ã®ã³ã¡ã³ããããäžåºŠèŠãŠã¿ããšãå®éã«ã¯fpectlãæ©èœããŠããªãã£ãããã§ãã ã³ã¢ãã³ããçºçããããšã¯æ³å®ãããŠããŸããã ïŒcysignalsãfpectlã³ãŒãããªãŒããŒã©ã€ãããŠããããã«èŠãããããå®è¡ãããŸãããïŒ
ãããåã³çºçããå Žåã¯ã1åã®CåŒã³åºããè¡ã£ãŠSIGFPEãæå¹ã«ããŠããããããã¬ãŒã䜿çšããŠã¹ã¿ãã¯ãã¬ãŒã¹ãååŸããå¿ èŠããããŸãã ã¹ã¿ãã¯ãã¬ãŒã¹ãååŸããããã«ãããã°ãã«ãã¯å¿ èŠãããŸããã ããªããããå¿ èŠãããã®ã¯ã·ã³ãã«ãåãé€ãããšã ãã§ã¯ãããŸããã ãããŠããããããåã³çºçããå Žåã«åããŠãä»ã§ã¯ããã£ãŠããŸãã
ããã¯ãããã°ããã®ã«æ¬åœã«ã€ã©ã€ã©ããããšã ãšç解ããŠããŸããããããäœãéæããããæ確ã«èª¬æããããšããã§ããªãå Žåãä»ã®ãããžã§ã¯ããåºæ¬çãªã€ã³ãã©ã¹ãã©ã¯ãã£ãå€æŽãŸãã¯ç¶æããå¿
èŠããããšäž»åŒµããããšã¯åœ¹ã«ç«ã¡ãŸããã ïŒç§ã¯å®éãããã§äœããå€æŽããããšã§ããã®çš®ã®ãã°ãããæ©ãèŠã€ããã®ã«ã©ã®ããã«åœ¹ç«ã€ãšæããããããŸããã longjmp
ã®å
šäœçãªã¢ã€ãã¢ã¯ãããªããæãããæ£ç¢ºãªæ
å ±ãç Žå£ããããšã§ããïŒ
æåŸã«ãããã¯clangCã³ã³ãã€ã©ã®é·å¹Žã®ãã°ã«èŠçŽãããããšãå€æããŸããã åºæ¬çã«ã double
ç¹å®ã®ç¯å²ã§ã¯ã
unsigned long a;
double b;
...
a = b;
FE_INVALID
ïŒå Žåã«ãã£ãŠã¯FE_INEXACT
ïŒãçºçãããŸãã ãšããã§ãããã¯ä»ã®ã¿ã€ãã®ãããŒãããŒã¿ã«ã圱é¿ãåãŒããŠããŸãã åªããMPFRïŒMPFRã¯ããã«ãä»»æã®ç²ŸåºŠã®ãããŒãã«ã³ããŒããå¿
èŠããããŸãïŒäººã
ã¯åé¿çãæäŸãããããã»ãŒãžã®ããã«ä¿®æ£ããŸããã
ã¡ãªã¿ã«ãé¢é£ããããã«é·ãéïŒ2010幎以éã12åã®éããè€è£œãããïŒclangãã°8100ã¯ãçŸæç¹ã§fpectl
é©åã«æ©èœãããããã«clangã®fenv.h
ã䜿çšããèŠèŸŒã¿ã¯ãªããšè¿°ã¹ãŠããŸãã ã Clangã¯ããã®ç¹ã§C99ã«å®å
šã«ã¯æºæ ããŠããããéåžžã«æ¥ãããããå±ã§ãã
numpy
ãããã«ã€ããŠäœãããããã©ããããããªãã ããããã RuntimeWarning
ã¯åã«ã³ã³ãã€ã©ã®ãã°ãåå ã§ããå¯èœæ§ããããšããã³ã¡ã³ãïŒãclangbug 8100ããåŒçšãããã¯éåžžã«é¡èãªäŸã§ãïŒã圹ç«ã€ãããããŸããã
ãã°8100ã¯é¢ä¿ãããŸããã ããã¯ãC99ãã©ã°ããæµ®åå°æ°ç¹æé©åãç¡å¹ã«ããããã®ãã®ã§ãããäž»æµã®ã³ã³ãã€ã©ãŒã¯ãããããµããŒãããŠããŸããã numpyã¯ïŒã»ãšãã©ïŒãšã«ããæ©èœããããã§ã:-)
ãã°8100ã®ç²Ÿç¥ã¯ãclangãFPæäœãæ£ããã³ã³ãã€ã«ãããŠããããšãæ°ã«ããªãããšã§ãã åŒè·å£«ã¯åæããªããããããŸãããã :-)
OKããã§ã«è¿°ã¹ããã°17686ã¯ç¢ºãã«é¢é£ããŠããŸãã