前提・実現したいこと
c++で二分法の計算をするプログラムを作っています。
ループで演算した近似解aをxに格納したいのですが、エラーが出てその文以下のデバッグがうまくいきません。
発生している問題・エラーメッセージ
44行目if文で止まってしまい、/結果の出力/の部分が出力されない。
エラーメッセージ Run-Time Check Failure #3 - The variable 'x' is being used without being initialized.
該当のソースコード
C++
1ソースコード 2/* 二分法のプログラム*/ 3 4#include <stdio.h> 5#include <math.h> 6 7/* プロトタイプ宣言 */ 8double func(double); 9 10int main() 11{ 12 /* 変数宣言 */ 13 int iter; 14 double a, b, c, s, eps, x; 15 16 /* 初期化 */ 17 a = 1.5; 18 b = 3.0; 19 eps = 1.0e-12; 20 iter= 0; 21 x = 0; 22 23 printf("初期区間は[%f, %f]\n", a, b); 24 printf("二分法を実行します\n\n"); 25 26 /* 二分法 */ 27 while( eps < fabs(b-a) ) { 28 29 iter++; 30 31 c = (a+b)/2; 32 33 s = func(a) * func(c) ; 34 35 if ( s > 0 ) a = c ; 36 else if ( s < 0 ) b = c ; 37 else{ x = c ; break ;} 38 39 printf("反復回数%d回\n",iter); 40 printf("近似解は%.16fです\n",a); 41 printf("残差は %.2e です\n", fabs(func(a))); /*確認*/ 42 43 } 44 45 if ( x != c ) x = a; 46 47 48 /* 結果の出力 */ 49 printf("反復回数 %d 回\n", iter); 50 printf("近似解は %.16f です\n", x); 51 printf("残差は %.2e です\n", fabs(func(x))); 52 53 return 0; 54} 55 56/* 関数値の計算 */ 57double func(double x){ 58 59 return x*x*x -2*x*x -x +2 ; 60 61}
試したこと
エラーメッセージから、xを初期化すべきなのかと考えx=0を入れましたがうまくいきませんでした。
補足情報(FW/ツールのバージョンなど)
Microsoft Visual C++ 2010 Express
追記
xを初期化せずに行った場合の、ループ内で得られた計算結果は以下になりました。
反復回数 41回
近似解 1.9999999999995453
残差 1.36e-12
これを、ループを抜けたあとの/*結果の出力*/部で表示したいのですが、x=aと置くためのIf文でエラーが出てしまいできません。
また、x=0で初期化するとループ内の計算結果すら表示がされません。
近似解がcになる場合とaになる場合を区別したいため変数xを使いましたが、xにaを格納するためのIf文がおかしいのでしょうか?
回答1件
あなたの回答
tips
プレビュー