Я кодирую функцию C, которая позволяет мне преобразовывать любое число с плавающей запятой или двойное число в строку, содержащую 32 бита из 0 и 1 (согласно стандарту IEEE754).Я не собираюсь использовать printf, поскольку цель состоит в том, чтобы понять, как она работает, и уметь хранить строку.
Я взял метод исчисления из этого видео: https://www.youtube.com/watch?v=8afbTaA-gOQ. Этопозволил мне разобрать числа с плавающей точкой в 1 бит для знака, 8 бит для экспоненты и 23 бита для мантиссы.
Я получаю довольно неплохие результаты, но мой конвертер все еще не точен, и мойМантисса часто ошибается в последних битах.Метод, который я использую для вычисления мантиссы: (где strnew - это просто маллок соответствующей длины):
char *ft_double_decimals(double n, int len)
{
char *decimals;
int i;
if (!(decimals = ft_strnew(len)))
return (NULL);
i = 0;
while (i < len)
{
n = n * 2;
decimals[i++] = (n >= 1) ? '1' : '0';
n = n - (int)n;
}
return (decimals);
}
Для числа с плавающей запятой, такого как 0,1, я получаю эту мантиссу: 1001 1001 1001 1001 1001 100, где Iдолжен получить 1001 1001 1001 1001 1001 101. Это так расстраивает!Я, очевидно, что-то здесь упускаю, и, думаю, это как-то связано с неправильным приближением десятичных дробей, поэтому, если кто-то знает, какой метод мне следует использовать вместо того, который я использую, я буду очень признателен!