本文主要是介绍C++不使用任何 include文件得到+inf,-inf和nan,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
背景:
最近在看网易的公开课《斯坦福大学公开课:编程范式》,才知道大学的时候错过了一个多么好玩的课程。不过重点不在这里,而是终于能理解了之前一直没什么心情看的一些东西。代码部分用了《编程范式》提到的一些操作指针的技巧,当然单纯实现标题的要求完全可以不这样做。
相关知识:
IEEE浮点数表示法:
IEEE浮点标准用的形式来表示一个数。分为以下3个部分:
l 符号:s决定这个数是负数还是正数。
l 尾数:M是一个二进制小数。
l 阶码:E的作用是对浮点加权,可能是负数。
在单精度浮点格式(C 语言中的float)中,s、exp 和 frac 字段分别为s=1 位、阶码字段k = 8 位和尾数n = 23 位,得到一个 32 位的表示。
在双精度浮点格式(C 语言中的 double)中,s、exp 和 frac 字段分别为 1 位、k = 11 位和n = 52 位,得到一个 64 位的表示。
更多的东西请参考《深入理解计算机系统(原书第2版)》
代码:
#define ECHO(str) std::cout << str << std::endl
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//将char类型 指定l位填1
char pow(int l){
char g;
g = 1;
for(int i=2;i<=l;i++){
g*=2;
}
return g;
}
//将char类型 从指定i位到j位填1(包含两端)
char full(int i,int j){
char ret;
ret = 0;
for(int index=i;index<=j;index++){
ret += pow(index);
}
return ret;
}
int main(int argc, char** argv) {
char h[4]={0};
//展示单精度和字符型的长度 : 4 1 4
ECHO(sizeof(float) << " " << sizeof(char) << " " << sizeof(int));
//得到正无穷大: 0111 1111 1000 0000 0000 0000 0000 0000
h[3] = full(1,7);
h[2] = pow(8);
ECHO(*(float *)h);
//得到负无穷大: 1111 1111 1000 0000 0000 0000 0000 0000
h[3] = full(1,8);
h[2] = pow(8);
ECHO(*(float *)h);
//得到nan: 1111 1111 1000 0000 0000 0000 0000 0001
h[3] = full(1,8);
h[2] = pow(8);
h[0] = pow(1);
ECHO(*(float *)h);
return 1;
}
结果:
inf
-inf
nan
--------------------------------
Process exited with return value 1
Press any key to continue . . .
这篇关于C++不使用任何 include文件得到+inf,-inf和nan的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!