С++ pow (2,1000) является нормальным к большому для двойного, но он работает. Зачем?

код:

#iclude <math.h>

int main(){
double somenumber = pow(2, 1000);
printf("%lf\n", somenumber);
return 0;
}

Я получаю это огромное количество: 10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

Это, очевидно, большой для двойного. Как это работает?

Ответы

Ответ 1

Это, очевидно, большой для двойного. Как это работает?

2 1000 находится в диапазоне чисел, который может быть представлен двойным. Поэтому это число явно не слишком велико для двойного.

Я подозреваю, что то, что вы подразумеваете под "слишком большим", состоит в том, что количество напечатанных цифр намного больше, чем 16 цифр, которые могут быть сохранены в двойном размере. Там нет ничего плохого в том, чтобы просить компьютер печатать более 16 десятичных цифр. Что неверно, предполагается, что эти дополнительные цифры имеют какой-либо смысл.

В этом конкретном случае напечатанное число является точно правильным. Это потому, что компьютер относится к pow(2,some_int) специально. Силы 2 можно представить точно в двойном. Алгоритм, используемый для вычисления десятичного представления точного интегрального значения, даст точное правильное десятичное представление.

Все остальное, все ставки отключены. Измените свою программу, чтобы она печатала 3 646 например:

#include <math.h>
#include <stdio.h>

int main(){
  double somenumber = pow(3, 646);
  printf("%lf\n", somenumber);
  return 0;
}

Он по-прежнему будет печатать большое длинное число, но будут указаны только первые 16 цифр.

Ответ 2

double обычно имеет 11 бит для exp (-1022 ~ 1023 нормированный), 52 бит для факта и 1 бит для знака. Таким образом, он просто не слишком велик. Подробнее см. IEEE 754 в Википедии

Ответ 3

Это сила двух, и плавающая точка по существу хранится как (кратные) степени два.

Аналогично, в десятичной системе вас не должно удивлять, что для представления 10 1000 требуется очень мало места, но такая краткая нотация будет невозможна для больших степеней других значений, как 3 1000= 1322070819480806636890455259752144365965422032752148167664920368226828597346704899540778313850608061963909777696872582355950954582100618911865342725257953674027620225198320803878014774228964841274390400117588618041128947815623094438061566173054086674490506178125480344405547054397038895817465368254916136220830268563778582290228416398307887896918556404084898937609373242171846359938695516765018940588109060426089671438864102814350385648747165832010614366132173102768902855220001.