максимальное количество битов, разрешенных после десятичной точки в long double в c

#c #types #double #precision

#c #типы #double #точность

Вопрос:

я решил проблему, посетив http://www.spoj.com/problems/CHI_ROOT /

(найдите n-й корень числа и выведите первые 101 значащие цифры результата без десятичной точки, конечных и начальных нулей) с помощью long double .

 sizeof(long double)=12;
 

следовательно, общее количество битов, выделенных для long double переменной, составляет 96 бит (12 * 8).

максимальное значение, которое может хранить переменная, составляет приблизительно 10 ^ 28.

я хочу знать, сколько максимальных цифр переменная может хранить после десятичной точки и как она хранит?

Комментарии:

1. Числа с плавающей запятой в большинстве систем представлены в формате IEEE с плавающей запятой .

2. 80 бит, а не 96, 64 из них хранят мантиссу. Поэтому он может представлять pow(2, 64) = 1.8E19 различных значений. Поэтому никогда не более 19 значащих десятичных цифр. Вы быстро потеряете единицу при выполнении каких-либо вычислений по значению, достаточно просто преобразовать из десятичной в двоичную, скажем, умножить и преобразовать обратно в десятичную, поскольку значение нужно округлить в три раза. Поэтому используйте 18 в качестве практического значения.

Ответ №1:

Вы можете запросить шаблон numeric_limits класса или <cfloat> макросы, чтобы получить количество значащих десятичных цифр после точки, которые он может точно отображать:

 #include <limits>
#include <iostream>

int main() {
    std::cout << std::numeric_limits<float>::digits10 << std::endl;
    std::cout << FLOAT_DIG << std::endl;
    // 6
    std::cout << std::numeric_limits<double>::digits10 << std::endl;
    std::cout << DBL_DIG << std::endl;
    // 15
    std::cout << std::numeric_limits<long double>::digits10 << std::endl;
    std::cout << LDBL_DIG << std::endl;
    // 18
}
 

На x86 a long double обычно сохраняется как формат расширенной точности (который имеет только 80 бит, а не 96 бит; sizeof дополняется до 12 байт из-за выравнивания).

Обратите внимание, что количество цифр намного меньше 101. Предполагается, что вы должны найти алгоритм для вычисления n-го корня с произвольной точностью.