4

たとえば、 Matlab でmax doubleより大きい数値を入力すると、およそが返されます。教育目的で、オーバーフロー エラー メッセージではなく、 Cコンパイラのようなオーバーフロー例外を取得したいと考えています。私の質問は次のとおりです。1.79769e+30810^309InfInf

  1. Infオーバーフロー例外ですか?

  2. もしそうなら、なぜCコンパイラは を返さないのInfですか?

  3. そうでない場合、Matlab でオーバーフロー例外を取得できますか?

  4. Infとオーバーフロー例外の間に違いはありますか?

Infまた、Matlab をチェックインしてから、関数で例外をスローしたくありませんerror()

4

3 に答える 3

3

1) C/C++ の浮動小数点

浮動小数点数の演算では、数値ではない結果が生成される場合があります。例:

  • 演算の結果は複素数です (考えてくださいsqrt(-1.0))
  • 操作の結果は未定義です(考えてください1.0 / 0.0
  • 演算の結果が大きすぎて表現できません
  • オペランドの 1 つが既に NaN または Inf である演算が実行された

IEEE754 の哲学は、デフォルトでそのような例外をトラップするのではなく、特別な値 (および) を生成し、プログラムを中断することなく計算を正常に続行できるようにすることです。このような結果をテストし、それらを個別に処理するのはユーザー次第です ( MATLABのおよび関数など)。InfNaNisinfisnan

NaN値には、NaN (Quiet NaN) と sNaN (Signaling NaN)の 2 種類があります。通常、浮動小数点数のすべての算術演算は、演算が正常に完了できない場合、(シグナリング タイプではなく) quiet タイプを生成します。

浮動小数点環境を制御し、 FP 例外をキャッチする (プラットフォームに依存する) 関数があります。

たとえば、Python がさまざまなプラットフォームに FP 例外制御モジュールを実装する方法を確認してください: https://hg.python.org/cpython/file/tip/Modules/fpectlmodule.c

2) C/C++ の整数

整数型は Inf や NaN を表すことができないため、これは明らかに浮動小数点とはまったく異なります。

  • 符号なし整数は剰余演算を使用します (したがって、結果が最大の整数を超える場合、値はラップアラウンドします)。これは、符号なし算術演算の結果が常に「数学的に定義」され、オーバーフローしないことを意味します。これを、整数に対して飽和演算を使用する MATLAB と比較してください(uint8(200) + uint8(200)になりますuint8(255))。
  • 一方、符号付き整数オーバーフローは未定義の動作です。
  • ゼロによる整数除算 は未定義の動作です。
于 2014-10-28T16:04:40.580 に答える
2

浮動小数点

MATLAB は、浮動小数点演算用のIEEE 標準 754を実装しています。この規格には、5 つの例外が定義されています。

  1. 無効な操作
  2. ゼロ除算
  3. オーバーフロー
  4. アンダーフロー
  5. 不正確

GNU C Libraryで指摘されているように、これらの例外はステータス ワードで示されますが、プログラムは終了しません。代わりに、例外に依存するデフォルト値が返されます。値は、実際の数値または特別な値の場合があります。MATLAB の特別な値は、、、、Infおよびです。これらの MATLAB シンボルは、読みやすさと使いやすさのために、公式規格の予約済みバイナリ表現の代わりに使用されます (ちょっとした構文糖衣)。特別な値の操作は明確に定義されており、直感的な方法で操作できます。-InfNaN-0

この情報があれば、質問に対する答えは次のようになります。

  1. Inf上記の例外のいずれか (つまり、1、2、または 3) を発生させる操作が実行されInf、デフォルトの戻り値であると判断されたことを意味します。

  2. プログラムの作成方法、C使用されているコンパイラ、および存在するハードウェアにINFINITY応じNaNて、操作によって返される可能性のある特別な値ですC。それは、IEEE-754 標準が実装されたかどうか、およびどのように実装されたかによって異なります。C99 には標準の一部として IEEE-754 実装がありますが、実装がどのように機能するかは最終的にはコンパイラ次第です (これは、積極的な最適化や丸めモードなどの標準オプションによって複雑になる可能性があります)。

  3. Infまたはの戻り値は-Inf、オーバーフロー例外発生した可能性があることを示しますが、無効な操作またはゼロ除算の可能性もあります。MATLAB がそれがどれであるかを教えてくれるとは思いません (ただし、コンパイルされた MEX ファイルを介してその情報にアクセスできるかもしれませんが、私はそれらに慣れていません)。

  4. 回答 1 を参照してください。

より楽しく詳細な例については、こちらの PDFをご覧ください。


整数

MATLAB では、整数は上記のように動作しません。指定されたビット サイズの整数に対する操作がそのクラスの最大値を超える場合、それは最大値に設定され、負の場合 (符号付きの場合) はその逆になります。つまり、MATLAB 整数はラップされません。

于 2014-10-27T19:36:31.867 に答える