|
bugsさんアドバイスありがとうございます。
今回のエラーについて色々考えて下記のように考えたのですが正しいと言えるのでしょうか?
cal5() を下記のようにします。
double calculate::cal5()
{
union{ // double のビットデータを調べる為の準備
double num;
char ch[sizeof(double)];
};
if(b){ // * 処理後表示
cout<<"* 処理のため cal5 に数値を取りにくる\n";
cout<<"p="<<p<<endl;
cout<<"バイト毎のデータ−:d=";
for(int i=0; i<sizeof(double); i++) cout<<(int)ch[i]<<' '; // d の正体を確認
cout<<endl;
}
if(isdigit(*p) || *p=='.'){ // 数値獲得
num=strtod(p,&p);
}else if(*p=='(' || *p=='['){ // 括弧処理
p++;
num=cal1();
p++;
}
if(b) cout<<"cal5 内処理終了\n"; // * 処理後表示
return num;
}
実行結果
中略(2つ目の計算過程から)
* 処理開始
* 処理のため cal5 に数値を取りにくる
p=log2.01855182604945327
バイト毎のデータ−:d=0 0 0 0 -48 78 -15 127
cal5 内処理終了
ここでエラー終了してしまいます。
バイト毎のデータ−を利用して下記のプログラムで d の値を再現します。
#include <iostream>
using namespace std;
double f()
{
union{
char ch[sizeof(double)];
double d;
};
char str[]={0,0,0,0,-48,78,-15,127}; // バイト毎のデータ−
int i;
cout<<"f() 関数開始\n";
cout<<"エラーが発生する前に生成された d をバイト単位で表示 及びコピー\n";
for(i=0; i<sizeof(double); i++){
ch[i]=str[i]; // 問題となる d をコピー
cout<<(int)ch[i]<<' '; // バイト単位で d の表示
}
cout<<endl;
cout<<"f() 関数終了\n";
// d=0; // これを実行すると問題無く動作します
return d; // 返すことが出来なければ、d の値がエラーの原因になります
}
int main()
{
cout<<"メイン関数内:f() 実行前\n";
cout<<"f() 関数戻り値:"<<f()<<endl; // 私の環境では、返ってくることが出来ません
cout<<"メイン関数内:f() 実行後\n";
return 0;
}
処理結果:
メイン関数内:f() 実行前
f() 関数開始
エラーが発生する前に生成された d をバイト単位で表示 及びコピー
0 0 0 0 -48 78 -15 127
f() 関数終了
ここでエラーが発生して終了してしまいます。
以上から不定値を持つ d の条件によってエラーが発生する事になり、
double を不定値のままで使ってはいけない事になります。
最後に、
>因みに、かずまさんのコードに同様の確認をしたところ結果が
>
>* 処理開始
>cal 内通常処理:初期値 d=9.78541e-307
>
>となり、使用できる初期値を持っているようで、何か変化を与えるとdouble num; の初期値が変化して、
>この初期値に依存しながらエラーが出るかどうか決まってくるようです。
かずまさんのコードが難しくてどのように動作するか現在思考中なのですが、
このコードの場合不定値処理を発生させないような気がするので、
これを比較する意味がないような気がしてます。
|