Программирование на C: создание функции для преобразования double в строку - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь закодировать функцию, которая конвертирует double в строку (своего рода функция dtoa).Я не хочу использовать какую-либо стандартную библиотеку, которая сделает всю работу за меня (ито, все в порядке, strlen тоже, потому что я могу кодировать их самостоятельно).Моя основная идея заключалась в том, чтобы извлечь целую часть, выполнив что-то вроде этого:

/* Let's suppose that str is ok, and d > 0 */
/* Let's also suppose that we don't need to round the result */
/* Let's finally suppose that precision is greater than 0 */

char *dtoa(double d, int precision, char *str)
{
    int     int_part;
    size_t  i, len;
    char    *temp;
    int     decimals;

    if (str == NULL)
        return (NULL);
    int_part = (int)d;
    temp = itoa(int_part);
    i = 0;
    len = strlen(temp);
    while (i < len)
    {
        str[i] = temp[i];
        i++;
    }
    d -= (double)int_part;
    str[i] = '.';
    i++;
    decimals = 0;
    while (decimals < precision)
    {
        d *= 10;
        int_part = (int)d;
        str[i] = int_part + '0';
        i++;
        decimals++;
        d -= (double)int_part;
    }
    return (str);
}

Эта функция работает не так плохо.Я думаю, что я немного глуп, потому что я мог бы извлечь несколько десятичных чисел вместо того, чтобы извлекать их одно за другим.Но даже когда я попробовал этот другой метод, у меня была проблема.На самом деле, когда я делаю это, это работает много раз.Но для некоторых из них я теряю точность.Например, когда я пытаюсь с 1.42, у меня получается 1.4199.

Мой вопрос: есть ли простой способ решить эту проблему, или мне нужно изменить все методы преобразования?Несколько лет назад я узнал о том, как кодируются числа с плавающей запятой (используя представление IEE-754), но я хотел бы избежать создания своего рода преобразователя IEE-754.

Спасибо за вашу помощь!

Редактировать: это просто упражнение, я не собираюсь отправлять ракету на Марс с этой функцией (астронавты благодарны).

Edit2: похоже, 1,42 не«правильный» дубль.Но в таком случае, почему это работает нормально?

printf("Number: %lf\n", 1.42);
...