年终散分+展示浮点数格式C代码

赵4老师 2013-12-23 04:24:11


用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10)
同理,用二进制小数也不能精确表示某些10进制小数。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
int main() {
float f;
double d;
char bs[65];
char b[65];
char s[80];
unsigned char *p;
char e[12];
char *t;
int ex;

while (1) {
printf("Input a float point number:");fflush(stdout);
rewind(stdin);
fgets(s,80,stdin);
if (1==sscanf(s,"%f",&f) && 1==sscanf(s,"%lf",&d)) break;
}
printf("f=%g\n",f);
p=(unsigned char *)&f;
printf("hex=%02X %02X %02X %02X\n",p[3],p[2],p[1],p[0]);
ltoa(*(long *)&f,b,2);
sprintf(bs,"%032s",b);
printf("bin=%s\n",bs);
printf("bin=%.1s %.8s %s\n",bs,bs+1,bs+9);
strncpy(e,bs+1,8);e[8]=0;
ex=strtol(e,&t,2);
printf(" %c %-4d-127 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+9);
ex-=127;
printf(" %c %-8d 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+9);

printf("\nd=%lg\n",d);
p=(unsigned char *)&d;
printf("hex=%02X %02X %02X %02X %02X %02X %02X %02X\n",p[7],p[6],p[5],p[4],p[3],p[2],p[1],p[0]);
_i64toa(*(__int64 *)&d,b,2);
sprintf(bs,"%064s",b);
printf("bin=%s\n",bs);
printf("bin=%.1s %.11s %s\n",bs,bs+1,bs+12);
strncpy(e,bs+1,11);e[11]=0;
ex=strtol(e,&t,2);
printf(" %c %-6d-1023 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+12);
ex-=1023;
printf(" %c %-11d 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+12);

return 0;
}
//Input a float point number:0.125
//f=0.125
//hex=3E 00 00 00
//bin=00111110000000000000000000000000
//bin=0 01111100 00000000000000000000000
// + 124 -127 1.00000000000000000000000
// + -3 1.00000000000000000000000
//
//d=0.125
//hex=3F C0 00 00 00 00 00 00
//bin=0011111111000000000000000000000000000000000000000000000000000000
//bin=0 01111111100 0000000000000000000000000000000000000000000000000000
// + 1020 -1023 1.0000000000000000000000000000000000000000000000000000
// + -3 1.0000000000000000000000000000000000000000000000000000
//

...全文
23611 53 打赏 收藏 举报
写回复
53 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
赵4老师 2016-02-01
引用 6 楼 derekrose 的回复:
老师年终奖准备拿多少
今年的年终奖在哪里?
  • 打赏
  • 举报
回复
paschen 2015-02-03
  • 打赏
  • 举报
回复
tuke2010 2014-09-29
  • 打赏
  • 举报
回复
llwwzz 2014-09-09
碉堡了
引用 33 楼 SKATE11 的回复:
智者的梦再美,也不如愚人实干的步伐! 讲一千遍理论,不如写一行代码! 任何语言不落实到实际行动上都等于白说, 没读过MSDN例子代码的程序员实在让人感到可怕! 用C语言1000行源码能完成的工作千万不要用C++重写, 整天把高级技术放在嘴边那是一种浮夸! 少年啊,千万要重视单步调试和设置断点, 用VC调试时记得按下Alt+5、Alt+6、Alt+7和Alt+8。 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和 寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时 候。 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码! 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文 字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针 的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 进程都退出了,输入缓冲区刷不刷新都无关痛痒。 不要企图优雅的结束(因为这是不可能办到的) 而要在烂的不能再烂的摊子上也能重整河山! 这个世界上最大的差别和最远的距离都存在于“说”和“做”之间。 常立志不如立长志,立长志不如立即干! 崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 关于自己是否适合编程的很简单的测试: 在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案: A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感 A不适合编程(理由:打字准确度偏低、粗心大意) B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念) C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证) D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!) 如果想从A变成B的话,到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习” 代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试是程序员必须掌握的技能之一。
  • 打赏
  • 举报
回复 1
c-h-u 2014-09-02
  • 打赏
  • 举报
回复
默伊清风 2014-08-28
  • 打赏
  • 举报
回复
以后跟着赵老师混了,
  • 打赏
  • 举报
回复
赵4老师 2014-05-13
引用 43 楼 u010142440 的回复:
赵老师,我输入0.0,你的代码就错了哟
刚亲自试了,没错!
Input a float point number:0.0
f=0
hex=00 00 00 00
bin=00000000000000000000000000000000
bin=0 00000000   00000000000000000000000
    + 0   -127 1.00000000000000000000000
    + -127     1.00000000000000000000000

d=0
hex=00 00 00 00 00 00 00 00
bin=0000000000000000000000000000000000000000000000000000000000000000
bin=0 00000000000   0000000000000000000000000000000000000000000000000000
    + 0     -1023 1.0000000000000000000000000000000000000000000000000000
    + -1023       1.0000000000000000000000000000000000000000000000000000
  • 打赏
  • 举报
回复
lanlvy 2014-05-13
以后跟着赵老师混了,
  • 打赏
  • 举报
回复
wu4357815 2014-05-12
学习一下。。。。。
  • 打赏
  • 举报
回复
赵老师,我输入0.0,你的代码就错了哟
  • 打赏
  • 举报
回复
Rfiy 2014-04-07
顶啊,楼主说的好啊,虽然没看懂啊,啦啦
  • 打赏
  • 举报
回复
耶鲁於 2014-01-16
rewind(stdin);之前没有fflush(stdin);,那会不会读到别人的东西啊
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
怎么总是晚一步
  • 打赏
  • 举报
回复
aibao1266 2013-12-26
顶一下
  • 打赏
  • 举报
回复
海阔天空555 2013-12-25
来接分
  • 打赏
  • 举报
回复
dendiy 2013-12-25
  • 打赏
  • 举报
回复
modyaj 2013-12-25
我还以为是发年终呢
  • 打赏
  • 举报
回复
bailian4399 2013-12-25
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
C语言
加入

6.6w+

社区成员

C语言相关问题讨论
社区管理员
  • C语言
  • 小灸舞
申请成为版主
帖子事件
创建了帖子
2013-12-23 04:24
社区公告
暂无公告