#include <math.h>
#include <stdio.h>
int main(void) {
double dbl = 0; /* I started with 9007199254000000, a little less than 2^53 */
while (dbl + 1 != dbl) dbl++;
printf("%.0f\n", dbl - 1);
printf("%.0f\n", dbl);
printf("%.0f\n", dbl + 1);
return 0;
}
< p > 4.940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625e-324
< p > 1.1779442926436580280698985883431944188238616052015418158187524855152976686244219586021896275559329804892458073984282439492384355315111632261247033977765604928166883306272301781841416768261169960586755720044541328685833215865788678015827760393916926318959465387821953663477851727634395732669139543975751084522891987808004020022041120326339133484493650064495265010111570347355174765803347028811562651566216206901711944564705815590623254860079132843479610128658074120767908637153514231969910697784644086106916351461663273587631725676246505444808791274797874748064938487833137213363849587926231550453981511635715193075144590522172925785791614297511667878003519179715722536405560955202126362715257889359212587458533154881546706053453699158950485070818103849887847900390625e-308
< p > 4.4501477170144022721148195934182639518696390927032912960468522194496444440421538910330590478162701758282983178260792422137401728773891892910553144148156412434867599762821265346585071045737627442980259622449029037796981144446145705102663115100318287949527959668236039986479250965780342141637013812613333119898765515451440315261253813266652951306000184917766328660755595837392240989947807556594098101021612198814605258742579179000071675999344145086087205681577915435923018910334964869420614052182892431445797605163650903606514140377217442262561590244668525767372446430075513332450079650686719491377688478005309963967709758965844137894433796621993967316936280457084866613206797017728916080020698679408551343728867675409720757232455434770912461317493580281734466552734375e-308
注意,2 to power of 1023转换为十进制指数,使用10 to the power of 308作为最大值。这使您可以看到数值在Human值,或Base10数值格式的二进制计算。数学专家通常不会解释所有这些值都是相同的数字,只是不同的进制或格式。
double的真正最大值是无穷大
最后,当整数达到可能的最大数或可能的最小小数部分时会发生什么?
事实证明,双精度浮点数为64位指数和尾数保留了一组位值,以存储其他四种可能的数字:
+∞
∞
+ 0
-0
例如,存储在64位内存中的双位数中的+0是计算机内存中的一大行空位。下面是在使用双精度浮点数时超出可能的最小小数(4.94E-324)后发生的情况。它在内存耗尽后变成+0 !计算机将返回+0,但在内存中存储0位。下面是全64位的存储设计在位双计算机内存。第一个位控制积极的或负数字的+(0)或-(1),接下来是11位的指数(所有的零都是0,所以变成了2 to the power of 0 = 1),而53位的大块用于+00或+01,它表示0。所以+0用全0表示!
MAXIMUM TO MINIMUM POSITIVE VALUE RANGE
1.79E308 to 4.94E-324 (+Infinity to +0 for out of range)
MAXIMUM TO MINIMUM NEGATIVE VALUE RANGE
-4.94E-324 to -1.79E308 (-0 to -Infinity for out of range)
But the SAFE and ACCURATE MAX and MIN range is really:
9007199254740991 (max) to -9007199254740991 (min)
所以你可以看到+-∞和+-0添加,双精度有额外的最大和最小范围,以帮助你当你超过最大和分钟。
如上所述,当你从最大的正数值到最小的十进制正数值或分数时,位归零,你得到0 Past 4.94E-324这个双精度数不能存储任何更小的十进制分数值,所以它在位注册表中崩溃为+0。同样的事件也发生在微小的负小数上,它们的值超过了-0。正如你所知道的-0 = +0,所以虽然内存中存储的值不相同,但在应用程序中它们经常被强制为0。但是请注意,许多应用程序确实交付了带符号的0 !