Как определить точность перевода дробной части двоичного числа?

У меня есть число в десятичной системе. Типа двойная. Я перевожу это, используя дробную часть цикла шансы, это выглядит так:

double part;
part = part - int(part);
        for (auto i = 0; i < ACCURACY; i++) //Точность
        {
            part *= typeEncode;

            result += std::to_string(int(part));
            if (part >= typeEncode / 2)
            {
                part -= int(part);
            }
        }

И я передаю такой номер:

double E1 = 0.15625;

И оказывается, я нахожу количество элементов равным ТОЧНОСТИ. Как рассчитать ТОЧНОСТЬ, которая для каждого числа уникальна? А потом появились лишние нули или двоичные числа обрезания.

1 ответ

Решение

Внутреннее представление double не является десятичным, он уже двоичный и определяется международным стандартом IEEE 754. double является 64-битным и состоит из 3 частей: знак (1 бит), показатель степени (11 бит) и значимое (52 бита).

Грубо говоря, это разделение позволяет хранить как очень маленькие, так и очень большие числа с одинаковой точностью: экспонента содержит информацию о величине и значении и сохраняет фактическое значение.

И именно поэтому мы сразу видим проблему вашей программы: сначала вы берете только дробную часть, здесь некоторая информация теряется, и вы не знаете, сколько потеряно. Затем вы пытаетесь сделать какое-то преобразование а-ля "разделяй и властвуй", но проблема в масштабе: если вы разделите интервал [0, 1] на две равные части [0, 0,5) и [0,5, 1] в первом из них будет гораздо больше чисел.

Хорошей точкой для начала, вероятно, является эта статья (на русском языке) или статья в английской Википедии о числах с двойной точностью. После понимания внутреннего представления вы, вероятно, сможете извлечь нужные биты с помощью простых логических операций (например, & а также >>). Если вам нужен производственный код качества для преобразования десятичных чисел в двоичные, я бы порекомендовал эту библиотеку: https://github.com/floitsch/double-conversion.

Другие вопросы по тегам