#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-го корня с произвольной точностью.