28.16。 fpectl —浮動小数点例外制御
ノート
fpectl モジュールはデフォルトではビルドされておらず、その使用は推奨されておらず、専門家の手による場合を除いて危険な場合があります。 詳細については、制限および制限に関するその他の考慮事項のセクションも参照してください。
ほとんどのコンピュータは、いわゆるIEEE-754標準に準拠して浮動小数点演算を実行します。 実際のコンピューターでは、一部の浮動小数点演算は、通常の浮動小数点値として表現できない結果を生成します。 たとえば、試してみてください
>>> import math
>>> math.exp(1000)
inf
>>> math.exp(1000) / math.exp(1000)
nan
(上記の例は、多くのプラットフォームで機能します。 DEC Alphaは1つの例外かもしれません。)「Inf」はIEEE-754の特別な非数値であり、「無限大」を表し、「nan」は「数値ではない」を意味します。 数値以外の結果を除いて、Pythonにこれらの計算を実行するように依頼したときに特別なことは何も起こらなかったことに注意してください。 これは実際、IEEE-754標準で規定されているデフォルトの動作であり、それが機能する場合は、今すぐ読むのをやめてください。
状況によっては、例外を発生させ、障害のある操作が試行された時点で処理を停止する方がよい場合があります。 fpectl モジュールは、そのような状況で使用するためのものです。 いくつかのハードウェアメーカーの浮動小数点ユニットを制御できるため、ユーザーは、IEEE-754例外のゼロ除算、オーバーフロー、または無効な操作が発生するたびに、SIGFPE
の生成をオンにできます。 Pythonシステムを構成するCコードに挿入されるラッパーマクロのペアと並行して、SIGFPE
がトラップされ、Python FloatingPointError 例外に変換されます。
fpectl モジュールは次の関数を定義し、指定された例外を発生させる可能性があります。
- fpectl.turnon_sigfpe()
SIGFPE
の生成をオンにし、適切なシグナルハンドラーを設定します。
- fpectl.turnoff_sigfpe()
- 浮動小数点例外のデフォルト処理をリセットします。
- exception fpectl.FloatingPointError
- turnon_sigfpe()が実行された後、IEEE-754例外のゼロ除算、オーバーフロー、または無効演算のいずれかを発生させる浮動小数点演算により、この標準のPython例外が発生します。
28.16.1。 例
次の例は、 fpectl モジュールを起動して動作をテストする方法を示しています。
>>> import fpectl
>>> import fpetest
>>> fpectl.turnon_sigfpe()
>>> fpetest.test()
overflow PASS
FloatingPointError: Overflow
div by 0 PASS
FloatingPointError: Division by zero
[ more output from test elided ]
>>> import math
>>> math.exp(1000)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FloatingPointError: in math_1
28.16.2。 制限およびその他の考慮事項
IEEE-754浮動小数点エラーをトラップするように特定のプロセッサを設定するには、現在、アーキテクチャごとにカスタムコードが必要です。 特定のハードウェアを制御するには、 fpectl を変更する必要がある場合があります。
IEEE-754例外をPython例外に変換するには、ラッパーマクロPyFPE_START_PROTECT
およびPyFPE_END_PROTECT
を適切な方法でコードに挿入する必要があります。 Python自体は fpectl モジュールをサポートするように変更されていますが、数値アナリストが関心を持つ他の多くのコードはサポートしていません。
fpectl モジュールはスレッドセーフではありません。
も参照してください
ソースディストリビューション内のいくつかのファイルは、このモジュールがどのように動作するかについてさらに学ぶのに興味深いかもしれません。 インクルードファイル:source: `Include / pyfpe.h` では、このモジュールの実装についてある程度詳しく説明しています。 :source: `Modules / fpetestmodule.c` には、いくつかの使用例があります。 多くの追加の例が:source: `Objects / floatobject.c` にあります。