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

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

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.

2

Другие решения


По вопросам рекламы [email protected]