Numpy: clangでコンパむルされた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の倖郚で発行される可胜性がありたす。 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でも芋られたす。

党おのコメント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に蚭定されおいたすが、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に぀いお

  • ナヌザヌコヌドがFPフラグを䜿甚しお高速か぀緩く再生できるず思われる堎合、これらの譊告はせいぜいオプションである必芁がありたす。
  • そうでなければ、それらは暙準に保぀こずができたすが、少なくずもそれらが有甚であるためには、それらが由来する堎所の底に到達する方法が重芁です。 改善 fpectlは、埌者を実珟するための簡単な方法です。 倖郚ツヌルすべおの呜什の埌に䜕かをチェックするためにコヌドをむンストルメント化できるデバガヌなどを䜿甚するこずは、より難しく、遅く、゚ラヌが発生しやすくなりたす---たずえば、バグが最適化されたバむナリでのみポップアップするこずは珍しいこずではありたせん。十分にデバッグ可胜なバむナリでそれを芋぀けようずするずすぐに消えたす。
  • いずれにせよ、RuntimeWarningはオフにできるはずです。

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は確かに関連しおいたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡