2016-10-15 12 views
0

я решил проблему посещения http://www.spoj.com/problems/CHI_ROOT/максимальное число битов допускается после десятичной точки в длинных двойной в C++

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

sizeof(long double)=12; 

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

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

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

+2

Номера с плавающей запятой в большинстве систем представлены форматом с плавающей запятой [IEEE] (https://en.wikipedia.org/wiki/IEEE_floating_point). –

+0

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

ответ

1

Вы можете запросить the numeric_limits class template или <cfloat> macros, чтобы получить число значащих десятичных цифр после запятой, он может точно отображать:

#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 обычно хранит как формат extended precision (который имеет только 80 -биты, а не 96 бит, sizeof добавляется до 12 байтов из-за выравнивания).

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