C++ における浮動小数点例外の理解:原因と解決策
浮動小数点例外 ソフトウェアが数値に対して不適切な操作を実行しようとすると発生します。このタイプの例外は、ゼロによる除算、負の数の偶数による除算、負の数の平方根をとる、double データ型の制限を超える計算のオーバーフローなど、ユーザーが無効な演算を実行しようとしたときに発生します。
C++ では「SIGFPE」 シグナル ハンドラーは浮動小数点例外を処理します。 (FPE) ユーザーが前述のタスクを実行しようとすると、このシグナル ハンドラーが呼び出されます。シグナル ハンドラーが介入すると、標準出力にエラー メッセージを出力し、プログラムを停止します。
浮動小数点例外が発生するのはなぜですか?
浮動小数点の例外 プログラミング エラー、またはプログラムが仕様外の値を処理しようとしたときに発生する可能性があります。たとえば、プログラムが整数をゼロで除算しようとした場合、またはプログラムが負の数の平方根を取得しようとした場合、浮動小数点例外が発生します。 が発生します。さらに、 いくつかの浮動小数点の例外もあります。 プロセッサの誤検出が原因で発生する可能性があります。
不適切な演算、アンダーフロー、オーバーフロー、ゼロ除算、精度などの多くの要因により浮動小数点例外が発生する可能性があります。 。このセクションでは、これらの議論を 1 つずつ説明します。
1:違法な操作
ユーザーが演算の表現を忘れたり、演算に数学的値がない場合、無効な演算のためプログラムは実行できません。これには、負の数の平方根や対数などの計算が含まれます。複素数を扱う場合、負の数の平方根を求めることは可能ですが、これを表現するコンピュータベースのメカニズムはありません。
さらに、 ソフトウェアが浮動小数点を実行すると、誤った動作が発生します。 整数のみの場所での操作。これは、データに対して実行しようとしている演算 (浮動小数点演算) と保存されたデータ (整数) が一致しないことが原因です。
2:ゼロ除算
浮動小数点例外 整数をゼロで除算しようとするとスローされます。 NaN または無限大で除算しようとすると、同じことが発生します。以下にいくつかの例を示します:1/0, log(0)。
3:オーバーフロー
操作が予想範囲外の値を返した場合、オーバーフロー例外が発生します。このステートメントによれば、値は表現可能な最小値より大きいか小さいかのいずれかです。
4:アンダーフロー
アンダーフローは、計算の結果がデータ型が保持できる値よりも小さい場合に発生します。
5:不正確
操作の結果が予想されたものと異なる場合、これは不正確な例外として知られています。演算が無制限の精度と指数範囲で実行されると、これが発生します。
場合によっては、そのような状況は適切に処理できます。たとえば、プログラムが数値をゼロで除算しようとした場合、プログラムをクラッシュさせるのではなく、エラー メッセージを返してプログラムを正常に終了することが一般的に望ましいです。
#include
#include
名前空間 std を使用します;
float Div(float num, float den)
{
if (den ==0) {
throw runtime_error("数学エラー:0 で除算しようとしました\n");
}
return (num / den);
}
int main()
{
float num、denom、result;
数値 =10;
denom =0;
試してみてください{
result =Div(num, denom);
cout <<"商は " <
}
catch (runtime_error&e) {
cout <<"例外が発生しました" <
}
}
このコードでは、ディビジョン 関数はmain 内の try ブロックによって呼び出されます。 。 デノムの場合 はゼロに等しくありません 、部門 関数は商を返します。該当する場合は実行時エラー例外です。 投げられる。ランタイム エラー オブジェクト e を指定して what 関数を呼び出す前に、catch ブロックがこの例外をインターセプトし、「エラーが発生しました」というテキストを出力します。 。例外を識別するために使用されます。クラス標準例外。stdExcept で説明されています。 ヘッダー ファイルには、what() という仮想関数があります。 。メッセージ「数学エラー:0 で除算しようとしました」 結果として出力されます。
出力
浮動小数点例外を防ぐには C++ では、関数に渡されるすべてのパラメータをチェックし、適切な形式を使用し、除数がゼロ値かどうかを明示的にテストすることが重要です。さらに、double データ型を使用する場合、プログラムでより大きな演算結果が必要な場合は、データ型の範囲を拡大することが重要です。
浮動小数点の例外 C++ では、数値に対する無効な演算が原因で発生し、プログラムが正しく実行される能力に影響を与える可能性があります。このようなエラーを回避するには、関数に渡されるすべてのパラメーターを確認し、適切なデータ型を使用することが重要です。さらに、浮動小数点例外をキャッチすることも有益です。 .
結論
-
C++の二分木における疑似パリンドロームパス
ノード値が1から9までの数字であるバイナリツリーがあるとします。パス内のノード値の少なくとも1つの順列が回文である場合、バイナリツリーの1つのパスは疑似回文であると言われます。ルートノードからリーフノードに向かう疑似パリンドロームパスの数を見つける必要があります。 したがって、入力が次のような場合 その場合、出力は2になります。これは、ルートノードからリーフノードに向かう3つのパスがあるためです。赤いパスは[2,3,3]に従い、緑のパスは[2,1,1]に従い、パス[ 2,3,1]。これらのパスのうち、赤のパス[2,3,3]は[3,2,3]として再配置でき、緑のパス[2,1,1]は再配
-
バイナリツリーをC++のリンクリストにフラット化する
二分木があるとしましょう。リンクリストにフラット化する必要があります。したがって、ツリーが次のような場合- 出力ツリーは-になります これを解決するには、次の手順に従います- ser prev:=null rootを入力として受け取る再帰関数solve()を定義します。 ルートがnullの場合は、を返します。 解決(ルートの権利) 解決(ルートの左側) ルートの右側:=prev、ルートの左側:=null 前:=ルート 理解を深めるために、次の実装を見てみましょう- 例 #include <bits/stdc+