C++不使用任何 include文件得到+inf,-inf和nan

背景:

最近在看网易的公开课《斯坦福大学公开课:编程范式》,才知道大学的时候错过了一个多么好玩的课程。不过重点不在这里,而是终于能理解了之前一直没什么心情看的一些东西。代码部分用了《编程范式》提到的一些操作指针的技巧,当然单纯实现标题的要求完全可以不这样做。

相关知识:

现在所有的计算机都支持一个被称为IEEE浮点标准。

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版)》

代码:

#include <iostream>
#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;
}

结果:

4 1 4
inf
-inf
nan


--------------------------------
Process exited with return value 1
Press any key to continue . . .


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值