2011-01-23 4 views
1

Это может быть что-то очень простое, что мне просто не хватает, однако у меня возникают проблемы с использованием двойного типа данных. В нем указывается here, что двойной в C++ точный до ~ 15 цифр. Тем не менее, в коде:Несоответствия с двойным типом данных в C++

double n = pow(2,1000); 
cout << fixed << setprecision(0) << n << endl; 

п хранит точное значение 2^1000, то, что имеет длину 302 десятичных цифр в соответствии с WolframAlpha. Тем не менее, когда я пытаюсь вычислить 100 !, с помощью функции:

double factorial(int number) 
{ 
    double product = 1.0; 
    for (int i = 1; i <= number; i++){product*=i;} 
    return product; 
} 

Неточности начинают появляться на 16-й разряд. Может кто-то объяснить это поведение, а также предоставить мне какое-то решение.

Благодаря

+0

Нет ничего, чтобы решить эту проблему, как это было предусмотрено. –

+2

Сделайте домашный поиск для "IEEE 754" и ** ** **. – ephemient

+0

Нет, на странице ничего не говорится о том, чтобы быть точным. Он просто говорит, сколько цифр он может охватить. Точность - это то, как работает плавающая точка. – stefan

ответ

4

В конце концов вам нужно будет прочитать основы в What Every Computer Scientist Should Know About Floating-Point Arithmetic. Наиболее распространенным стандартом для аппаратных средств с плавающей точкой является, как правило, IEEE 754; текущая версия с 2008 года, но большинство процессоров не используют новую десятичную арифметику, представленную в выпуске 2008 года.

Однако число с плавающей запятой (double или float) сохраняет приблизительное значение, используя мантисса фиксированного размера (дробная часть) и показатель степени (2). Динамический диапазон показателей таков, что значения, которые могут быть представлены, составляют от 10 -300 до 10 +300 в десятичной форме с приблизительно 16 значащими (десятичными) цифрами точности. Люди настойчиво пытаются напечатать больше цифр, чем могут быть сохранены, и получить интересные и зависящие от машины (и зависящие от библиотеки) результаты, когда они это сделают.

Итак, то, что вы видите, является неотъемлемой частью арифметики с плавающей запятой на компьютерах с использованием значений фиксированной точности. Если вам нужна большая точность, вам нужно использовать одну из библиотек произвольной точности - их много.

4

Двойной фактически хранит показатель, который будет применен к 2 в его внутреннее представление. Так что, конечно, он может хранить 2^1000 точно. Но попробуйте добавить 1 к этому.

2

IEEE 754 дает алгоритм хранения данных с плавающей запятой. Компьютеры имеют конечное количество бит для хранения бесконечного числа чисел и, таким образом, вводят ошибку при хранении цифр.

В этом виде представления меньше места для точности, чем больше представленное число получает (больше == абсолютное расстояние от нуля). Вероятно, в этот момент вы видите потерю точности, и по мере того как вы получаете еще большие цифры, у нее будет еще большая потеря точности.

+0

ерунда! Это плавающая точка. Какое расстояние от нуля связано с этим? –

+0

@ Давид: Все? Чем дальше от нуля число, тем больше дельта до следующего представляемого числа. – fredoverflow

+0

@Fred Итак, как точно получается число с 300 десятичными цифрами? По этой так называемой логике это было бы невозможно, потому что вся точность была потеряна из-за большого расстояния от нуля. –

Смежные вопросы