之前看到一个帖子说doubel可以存储 21024−1 ,刚看的时候以为楼主说的是错的,今天想起来试试真的可以(不考虑精度问题)
这是double的:
#include<bits/stdc++.h>
using namespace std;
double a=1;
int main(){
freopen("awa.txt","w",stdout);
for(int i=1;i<=1023;i++){
a*=2;
}
printf("%lf",a);
return 0;
}
这是高精度的:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int main(){
freopen("awa1.txt","w",stdout);
int c[N]={1,0},n,lenc=1;
n=1022;
for(int i=1;i<=n;i++){
int x=0;
for(int j=1;j<=lenc;j++){
c[j-1]=c[j-1]*2+x;
x=c[j-1]/10;
c[j-1]%=10;
}
c[i+lenc]=x;
lenc++;
}
while(c[lenc]==0&&lenc>0) lenc--;
for(int i=0;i<=lenc;i++) cout<<c[lenc-i];
return 0;
}
不知道由于什么原因,printf输入 21024−1 时会输出 inf ,所以只测了 21023 。这两代码输出的答案是一致的,我很好奇double是怎么用 8 字节的空间存储 21023 ,或者说它不止是用了这 8 字节。
另一个问题是对已经存储了 21023 的double进行加减运算无效,这是精度的问题吗?是什么让加减运算无效了?
求dalao回答,玄关~