С++ 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.