c ++ pow(2,1000)对于double来说是正常的,但它正在发挥作用。 为什么?

代码:

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

我得到这个庞大的数字:10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

这显然是双重的。 它是如何工作的?

这显然是双重的。 它是如何工作的?

2 1000在可以用双精度表示的数字范围内。 所以这个数字显然不会太大。

我怀疑你所说的“太大”的意思是打印的位数远远大于可以存储在双倍数中的16位左右。 要求计算机打印超过16位十进制数字并没有错。 假设那些额外的数字有任何意义,这是错误的。

在这种特殊情况下,打印的数字完全正确。 那是因为计算机专门处理pow(2,some_int) 。 2的幂可以精确地表示为双精度。 用于计算精确积分值的十进制表示的算法将给出完全正确的十进制表示。

所有其他的,所有的赌注都关闭了。 更改您的程序,以便打印3 646例如:

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

它仍会打印一个很长的数字,但只有前16个左右的数字才是正确的。

对于exp(-1022~1023标准化), double通常有11位,事实为52位,符号为1位。 因此它不会太大。 有关更多说明,请参阅维基百科上的IEEE 754

它是2的幂,并且浮点基本上存储为2的幂的(倍数)。

同样,在十进制系统,它不应该令你感到惊讶,它需要的空间很小代表10 1000精确,但是这种简洁的符号不会为其他值的大的权力是可能的,像3 1000 = 1322070819480806636890455259752144365965422032752148167664920368226828597346704899540778313850608061963909777696872582355950954582100618911865342725257953674027620225198320803878014774228964841274390400117588618041128947815623094438061566173054086674490506178125480344405547054397038895817465368254916136220830268563778582290228416398307887896918556404084898937609373242171846359938695516765018940588109060426089671438864102814350385648747165832010614366132173102768902855220001。