Я пытаюсь закодировать функцию, которая конвертирует 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);