質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++Builder

C++Builderは、C/C++を用いてアプリ開発できる統合開発環境 (IDE) 。DelphiのC++版です。コンポーネントによるビジュアル開発、高機能なコードエディターなどで生産性の高い開発ができます。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

947閲覧

【C++Builder】比較で浮動小数点のオーバーフロー

nura_nura

総合スコア15

C++Builder

C++Builderは、C/C++を用いてアプリ開発できる統合開発環境 (IDE) 。DelphiのC++版です。コンポーネントによるビジュアル開発、高機能なコードエディターなどで生産性の高い開発ができます。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/02/15 01:29

既存ソフトの改善依頼なのですが、全容を把握するため実行したところ下記のif文の場所で「浮動小数点のオーバーフロー」のエラーになります。
ソフト自体は現在も使用されているもので、通常時は何かしらの通信機器があるためモードで省く設定にしています(このモード自体は不完全の可能性あり)。

問題個所(単体だと実行できる)

C++

1double m_temp = (double) (0.1) 2if (m_temp == 0) { 3 m_temp = 1; 4}
  • プロジェクトは再構築済み
  • 0.1の部分は変数が入っていましたが切り分けのため改変したところ0.1そのものでもエラー。(その他1,0,0.000000001,(double)無し等も試しましたがダメ)
  • 新規プロジェクトで抜粋部分のみ実行は問題なし。
  • プロジェクト内に同名の変数名もありません。
  • 一つ上の行からトレース実行 ⇒ if文の箇所で例外処理関数に飛ぶだけ。
  • 該当箇所は長い関数の途中に記載されている

環境:C++builder5 Win7

コメントアウトして先に進むと複数個所で同じようなエラーに当たります。
別スレッドが動いていてそちらで問題が発生しているのでしょうか(であれば確認方法教えていただきたい)。
個人的にすごく謎なのでお知恵をお借りしたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/02/15 02:01

エラーメッセージはいらぬ翻訳省略しないでそのままコピペで提示しましょう
nura_nura

2021/02/15 02:38

セキュリティ上の関係で手打ちになりますが エラーダイアログ「プロジェクト〇〇.exeがEOverflowクラスの例外を生成しました。'浮動小数点数のオーバーフロー'プロセスは停止しています。再開するにはステップ実行または実行を選択してください」
tiitoi

2021/02/15 04:34 編集

問題は質問に貼ってある該当個所ではないのでは? 浮動小数点関係というと、0除算が起こっている個所がないか確認するとかでしょうか?
FKD

2021/02/15 07:19

変数名(m_temp)から、所属クラスが破棄済みとか? 後は、該当箇所突入前にFNCLEX(asmで)で浮動小数点例外フラグをクリアして問題がなくなるなら、 そこにたどり着く前に、サイレントで例外フラグが立つ処理があるのだと思われます。
nura_nura

2021/02/16 01:21

情報ありがとうございます。アセンブリって記述できるんですね。知りませんでした。 asmは「Out of hash space」でコンパイル通りませんでしたが、例外フラグというヒントを得て無事解決しました。
guest

回答3

0

ベストアンサー

C++ の言語仕様上は、プログラムが未定義動作を含む場合にその未定義動作を引き起こす書き方がされている箇所を通過するとき以外に実際の影響が表れてもかまわないことになっています。

直接的にエラーやクラッシュが起きた場所とは遠く離れた箇所に原因がある場合もあり、ときには未定義動作が書かれている箇所よりも早くおかしな動作が起きることもあります。 タイムトラベルなどとも呼ばれることがある現象です。

プログラムのあらゆる箇所に原因が潜んでいる可能性があるので、少なくとも再現可能なプログラムが提示されないとどうにもなりません。 関連なさそうなところをどんどん削って、問題が再現しつつ検証が容易な程度の大きさにするのがまず第一歩でしょう。

投稿2021/02/15 06:12

SaitoAtsushi

総合スコア5446

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nura_nura

2021/02/15 06:32

なるほどタイムトラベルですか。勉強になります。 ありがとうございます。 関数自体が5千行、グローバル変数多用のソースコードなもんで削って行っても新たな場所で同エラー。 なかなか難儀中ですが、疑問はスッキリしました。
guest

0

Builderの表示⇒デバッグにあるFPUのウインドウで例外フラグを監視しつつ、ステップ実行
で問題個所を見つけられました。

皆様からのヒントをもとに解決できましたありがとうございます。

投稿2021/02/16 01:27

nura_nura

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

エラーではなくてワーニングなんではないでしょうか

投稿2021/02/15 02:03

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nura_nura

2021/02/15 02:42

実行時に出現し、ソフトが停止します。 今ソースコード削って検証していますが、入れ子でループしてたり、gotoが使われている部分が怪しいかなと思ってます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問