問題タブ [sigfpe]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
2087 参照

macos - OS X で clang の浮動小数点例外を有効にするにはどうすればよいですか?

浮動小数点エラーが発生したときにコードを終了させたい。linux-gcc では「feenableexcept()」関数が機能しますが、OSX では利用できません。OS X で gcc を使用する場合、( Mac OS X Intel で浮動小数点割り込みを有効にする ) で採用されたアプローチは、gcc を使用する場合は問題なく機能しますが、clang を使用する場合は機能しません。

コード例:

gcc5 を使用してコンパイルすると、結果は次のようになります。

素晴らしい。よく働く。ただし、clang (Apple LLVM バージョン 7.3.0 (clang-703.0.29)) を使用してコンパイルすると、結果は次のようになります。

良くない。FPE を発生させず、コードはただ動き続けました。私は周りを見回しましたが、clang で FPE を上げる方法が見つかりません。誰もこれを経験していますか?ありがとう!

0 投票する
0 に答える
283 参照

signals - PowerPC: 整数除算で SIGFPE が生成されない

ゼロ除算例外を処理するために、QNX に次のコードを実装しました。

}

変数の型が float または double の場合、このコードは SIGFPE を生成しますが、変数の型を int または long に変更すると、このコードは SIGFPE を生成しません。私は gcc コンパイラを使用しています。プロセッサは POWERPC MPC8347 で、OS は QNX です。整数値でもSIGFPEをテストしたい。以前の同じコードでは float の SIGFPE も生成されませんでしたが、後で fp_exception_mask() を追加しましたが、正常に動作しています。整数演算用のそのようなマスクはありますか?

0 投票する
1 に答える
742 参照

c++ - ランタイム エラー - SIGFPE

私はハッカーアース競争のための次のコードを持っており、C++ (g++ 4.8.4) で書かれており、実行時に SIGFPE を与えています。

それを修正する方法を教えてください

0 投票する
1 に答える
1037 参照

c++ - 算術演算で SIGFPE とオーバーフローを適切に回避する方法

C++、クラス、および関連するものを自分で学習するために、できるだけ完全な Fraction クラスを作成しようとしています。とりわけ、浮動小数点の例外とオーバーフローに対してある程度の「保護」を確保したかったのです。

目的:

一般的な演算で見られる算術演算でのオーバーフローと浮動小数点の例外を回避し、消費する時間/メモリを最小限に抑えます。回避できない場合は、少なくとも検出します。

また、アイデアは、より大きな型にキャストしないことです。これにより、いくつかの問題が発生します(より大きなタイプがない可能性があるなど)

私が見つけたケース:

  1. +、-、*、/、pow、root のオーバーフロー

    操作はほとんど簡単です (abですLong):

    • a+b: LONG_MAX - b > a の場合、オーバーフローが発生します。(不十分。aまたはbマイナスになる可能性があります)
    • ab: LONG_MAX - a > -b の場合、オーバーフローが発生します。(同上)
    • a*b: LONG_MAX / b > a の場合、オーバーフローが発生します。(b != 0 の場合)
    • a/b: a << b の場合は SIGFPE をスローするか、b << 0 の場合はオーバーフローをスローする可能性があります
    • pow(a,b): (pow(LONG_MAX, 1.0/b) > a の場合、オーバーフローがあります。
    • pow(a,1.0/b): a/b と同様
  2. x = LONG_MIN (または同等) の場合の abs(x) のオーバーフロー

    これは面白いです。すべての符号付き型には、可能な値の範囲 [-x-1,x] があります。abs(-x-1) = x+1 = -x-1 オーバーフローのため。これは、abs(x) < 0 の場合があることを意味します。

  3. -1 で割った大きな数値の SIGFPE

    numerator/gcd(numerator,denominator) を適用すると見つかります。ときどき gcd が -1 を返し、浮動小数点例外が発生しました。

簡単な修正:

  1. 一部の操作では、オーバーフローを簡単に確認できます。その場合は、いつでも double にキャストできます (大きな整数で精度が失われるリスクがあります)。アイデアは、キャストせずに、より良い解決策を見つけることです。

    分数算術では、簡単化のために追加のチェックを行うことができる場合があります。a/b * c/d (互いに素) を解くために、最初に a/d と c/b を互いに素にすることができます。

  2. または<0 または > 0 かどうaかを尋ねる場合、私はいつでもカスケードを行うことができます。bそのひどい選択に加えて、そのオーバーフローを回避する関数 neg() を作成できます
  3. abs(x) の gcd と同様の状況 (どこでも x > LONG_MIN) を取ることができます

2. と 3. が最適な解決策かどうかはわかりませんが、十分だと思われます。私はそれらをここに投稿しているので、誰かがより良い答えを持っているかもしれません.

最も醜い修正

ほとんどの操作では、オーバーフローをチェックして回避するために、多くの追加操作を行う必要があります。これで、1つか2つのことを学ぶことができると確信しています。

例:

これらの算術演算でオーバーフローを回避する最善の方法はどれですか?


編集: このサイトには非常によく似た質問がいくつかありますが、それらは同じではありません (特定の関連のない状況では、回避する代わりに検出する、署名する代わりに署名しない、SIGFPE)。

それらすべてをチェックすると、次のような適切な回答を提供するために修正時に役立つ可能性のあるいくつかの回答が見つかりました。

  • 符号なし加算でオーバーフローを検出します (私の場合ではなく、符号付きで作業しています):

他の回答は一般的すぎるため、私が見ているケースにより具体的な回答があるかどうか疑問に思います。