能否使用内置浮点类型(例如double或long-double)来表示2 ^ 1024?
答案 0 :(得分:1)
2 ^ 1024大于IEEE在64位计算机上可表示的最大浮点值。
2 ^ 1024 =
17976931348623159077293051907890247336179769789423065727343008115773267580550096313270847
73224075360211201138798713933576587897688144166224928474306394741243777678934248654852763
02219601246094119453082952085005768838150682342462881473913110540827237163350510684586298
239947245938479716304835356329624224137216
最大IEEE浮点数,大约1.7977 * 10 ^ 308 =
0 11111111110 1111111111111111111111111111111111111111111111111111(b)=
17976931348623157081452742373170435679807056752584499659891747680315726078002853876058955
86327668781715404589535143824642343213268894641827684675467035375169860499105765512820762
45490090389328944075868508455133942304583236903222948165808559332123348274797826204144723
168738177180919299881250404026184124858368
这些数字的区别是:
19958403095347198116563727130368385660674512604354575415025472424372118918689640657849579
65492635701089342446844192495243972437988393593660739171798284831420320005672951085676517
53772144436298718265335674454392399333081045512087038888885526844804415750712090687575604
16423584952303440099278848
这是最大的IEEE数目,因为64位按以下方式分解:
1 - sign
11 - exponent
52 - mantissa, or value
对于双精度类型,指数偏差为1023。请注意:11111111110(b)= 2046(d)。 2046-1023 =1023。这与您需要存储2 ^ 1024以及要为什么2 ^ 1023可以正常工作的1024相差。
答案 1 :(得分:1)
2 ^ 1024是否可以使用内置浮点类型(例如double或long-double)来表示?
2 1024 的值为1.797693134862315907729 ... * 10 308
以下内容可以将近似值2 1024 打印为long double
。但是,此值通常超过最大有限double
:DBL_MAX
。表示2 1024 的能力取决于实现。。以下是一个常见的实现。
#include <float.h>
#include <math.h>
#include <stdio.h>
int main(void) {
long double two1024 = powl(2,1024);
printf("2^1024 %.21Le\n", two1024);
printf("DBL_MAX %.21Le\n", DBL_MAX*1.0L);
return 0;
}
输出
v----- Difference begins here
2^1024 1.797693134862315907729e+308
DBL_MAX 1.797693134862315708145e+308
注意:
C仅要求LDBL_MAX >= DBL_MAX >= 1.0e+37
。
DBL_MAX
通常是binary64的最大有限值,即〜1.7976931348623157 ... e + 308。
在某些系统上,long double
范围与double
范围匹配。