以前はお世話になりました、今回も少し教えてください。
四則演算の答えを音声で答えてくれるプログラムを組んでいます。1の位まではなんとかできたのですが、小数点以下がうまく再生されずまた、原因が分からなく困っております。例えば変数b,cにキー入力された値を再生するのにbに格納された値はちゃんと再生されるのですが、cに入力された値がわけの分からない数字が再生され続け答えの再生まで行きません。再生方法は自作関数に値を受け渡し関数内で再生するようになっております。関数のソースを載せておきますのでどこが悪いのか指摘してください。よろしくお願いします。小数点のソースは一番したのwhile(i==0)からとなっております
int mame2(double iValue)
{
int d,f,i;
double g,h;
while(iValue<=9999)
{
f=(int)iValue;
g=f/iValue;
h=iValue-f;
cout <<g<<endl;
d=(int)iValue/1000;
iValue=iValue-(d*1000);
if(d!=1){
mame(d);
}
if(d==3)
{
sndPlaySound("vois/10002.wav",SND_SYNC);
}
else if(d==0){
}
else{
sndPlaySound("vois/1000.wav" ,SND_SYNC);
}
d=(int)iValue/100;
cout <<d<<endl;
iValue=iValue-(d*100);
if(d==8)
{
sndPlaySound("vois/82.wav" ,SND_SYNC);
}
else if(d==6)
{
sndPlaySound("vois/62.wav" ,SND_SYNC);
}else if(d!=1){
mame(d);
}
if(d==3){
sndPlaySound("vois/1003.wav" ,SND_SYNC);
}else if(d==6 || d==8){
sndPlaySound("vois/1002.wav" ,SND_SYNC);
}else if(d==0){
}else{
sndPlaySound("vois/100.wav" ,SND_SYNC);
}
d=(int)iValue/10;
iValue= iValue-(d*10);
if(d!=1){
mame(d);
}
if(d==0){
}else{
sndPlaySound("vois/10.wav" ,SND_SYNC);
}
d=(int)iValue;
mame(d);
cout <<"g="<<g<<endl;
cout <<"iValue="<<iValue<<endl;
cout <<"h="<<h<<endl;
if(g !=1)
{
sndPlaySound("vois/ten.wav",SND_SYNC);
i=0;
while(i==0)
{
h = h * 10;
cout <<"h1="<<h<<endl;
d = (int)h;
cout <<"d ="<<d<<endl;
h=h-(double)d;
cout <<"h2="<<h<<endl;
if(h==0.0){
i=1;
}
mame(d);
}
}
break;
}
return d;
}
正直プログラムの解析するのが面倒だ。
というかまったくわからん。
変数b,cって?
mameって?
h,h2,h1,d,fなんて俺には何の意味を持つ変数や表示なのかさっぱりわからない。
だからプログラムは見ずに回答する。
浮動小数点は誤差を含んでいるので
四則演算では簡単には文字列に出来ないんですよ。
たとえば
double a = 0.1;
のaは、0.1に近い値であり0.1ではありません。
double a = 0.1;
cout <<"a="<<a<<endl; // a=0.1
for(int i=1; i<100; ++i) a += 0.1;
a -= 10;
cout <<"a="<<a<<endl; // a=-1.95399e-014
double型の変数は、誤差が大きいので電卓などを作っていて、その四則演算の答えを音声でお知らせするのならば double 型は使わない方が良いでしょう。つまり、四則演算の部分を多倍長の整数などで計算させて誤差が少ないように工夫が必要です。よって、四則演算ソースを全面的に見直すべきです。分かりますか?以上。ちょっとしたアドバイスです。
ツイート | ![]() |