Подскажите, если кто сталкивался похожей проблемой...
Есть код:
#include <stdio.h>
int main(int argc, char **argv)
{
double t4;
t4 = (double)23/10;
printf("%f\n", t4);
return 0;
}
Если его запустить, то результат выводится как 2.3, что логично. Однако если смотреть дебагером, то в t4 лежит 2.299999999
А т.к. мне нужно использовать в дальнейшем остаток от деления, то получается какая-то «шляпа»...
Вот более полный код (код черновой), в котором я и столкнулся с данной проблемой.
Суть кода - задаем число, а на выходе получаем символьную строку разложенную по числам. Например 24 должно вернуть «4 20», 23 - «3 20», 213 - «3 10 200».
В нем получается так, если я задаю число например 24, то деление на 10 происходит нормально, а вот если 23 или 21 (не четное), то результат крайне странный.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
void speech_numbers(char *outstr, double num);
int main(void)
{
char bufer[200];
printf("Hello World!\n");
speech_numbers(&bufer[0],24);
printf("speech string: %s\n",bufer);
return 0;
}
void speech_numbers(char *outstr, double num){
int digit, cdigit, i;
double t0,t1,t2,t4;
char tbuf[100];
cdigit = 1;
i = 0;
printf("test\n");
if(num == 0){
outstr="0.wav\0";
printf ("zero\n");
return;
}
t4 = (double)23/10;
printf("%f\n", t4);
while(num >= (pow(10,cdigit-1))){
t0 = pow(10,cdigit);
t4 = (double)num/t0;
t1 = modf(t4,&t2)*10;
digit=(int)t1;
printf ("%f %f\n",t1,t2);
sprintf(&tbuf[i],"%d ",(int)(digit*(pow(10,cdigit-1))));
i += (cdigit+1);
cdigit++;
}
tbuf[i-1] = '\0';
sprintf(outstr,"%s",tbuf);
printf("bufer %s\n",tbuf);
}
Если кто-то решал подобную проблему, подскажите отчего так происходит и как с этим можно бороться.