LINUX.ORG.RU

Странный результат деления

 , ,


0

0

Подскажите, если кто сталкивался похожей проблемой...

Есть код:

#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);
}

Если кто-то решал подобную проблему, подскажите отчего так происходит и как с этим можно бороться.


Ответ на: комментарий от nanoolinux

ТС же на си пишет, так? Значит, английский знает. Надо быть совсем уж упоротым недоумком, чтобы лезть в программирование не зная английского.

anonymous
()
Ответ на: комментарий от anonymous

чукча ТС не читатель, он — писатель; если у него что-то не получается, он не пойдет читать мануалы, тем более охрененную простыню из двадцати каких-то нудных теорем да еще на английском языке; он просто запостит вопрос на лоре и будет ждать, пока такой же чукча не скажет ему, как надо делать, при этом не понимая пагубность подхода «главное — работает, а разбираться что/как/почему не обязательно»

anonymous
()
Ответ на: комментарий от anonymous

ТС же на си пишет, так?

так.

Значит, английский знает.

> char bufer[200].

сомневаюсь.

nanoolinux ★★★★
()
Ответ на: комментарий от anonymous

Ну так все же, почему таки «толсто»? Надо было не открывать перед убогим ТС-ом окно в прекрасный мир просвещения, а назвать его дебилом и послать учить уроки? Так, что ли?

anonymous
()
Ответ на: комментарий от anonymous

нет, «тонко» было бы предложить заюзать long double

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.