2 wuifa WUIFA 于 2014.08.08 12:07 提问

程序编译无问题,运行结果却因数据不同出现差错,新人求解!!!

#include
#include
struct employee
{
char name[20];
int age;
char sex;
float salary;
};
void main()
{
struct employee *p;
p = (struct employee *)malloc(sizeof(struct employee));
gets(p->name);
p->age = 26;
p->sex = 'M';
p->salary = 1087.2;
printf("Namw=%s\nAge=%d\n",p->name,p->age);
printf("Sex=%c\nScore=%f\n",p->sex,p->salary);
free(p);
}
上面程序为何在vc6.0中运行,salary的结果1087.2,1087.4等不能正确显示,如果是1087.5却可以,求大神指点!

2个回答

liyun123gx
liyun123gx   2014.08.08 16:57

float类型有一个精确度的问题,比如1087.2不一定存储的就正好是这个数,可能是1087.199951.
我在自己这试了一下,不改输出的精度的话,就是1087.199951,但是精确到小数点后1位,就是1087.2了

WUIFA
WUIFA 谢谢了,不过为什么会有存储的数不是对应这个数的情况,不是赋值的时候确定了吗,而且赋的值还是确定的精度。
接近 4 年之前 回复
liyun123gx
liyun123gx   2014.08.11 10:56

float型存储,一位符号位,30位到23位是指数位(127+实际的指数),低23位是基数位。
以5.1为例: 5 = 0101B
0.1 =0.0 0011 0011 0011 0011 0011 0011 0011 0011 0011B……(不断循环)
故: 5.1 = 101.0 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011……
科学计数法表示:1.010 0011 0011 0011 0011 0011 0011 0011……*2^2
符号位:0 指数位:127+2 = 129( 1000 0001B)
基数位那就要只取0.1的二进制表示的前23位了: 0100 0110 0110 0110 0110 011 。
这样所存储的结果,和你赋值的数就会不同。
那对于1087.5来说,小数部分0.5,二进制表示是0.1,1087.5用2进制表示为:100 0011 1111.1,
也就是1.00 0011 1111 1 * 2^10,符号位为0,指数位:127+10,基数位是 0000 1111 1110 0000 000,那么1087.5在计算机中存储的值就是1087.5

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
如何解决linux下编译环境,运行环境不同的问题
很多情况下编译是在一台机子上运行,而执行环境却不同,在网上找了一个方法,Novell的官方网站提供英文:http://www.novell.com/coolsolutions/feature/11775.html 中文翻译http://www.forwind.cn/2007/10/03/linux-binary-only/ 如何在不同版本Linux上运行Binary-Only应用包 在发布linux-fpga系列文章 和PowerPC平台Linux的移植系列文章后,很多朋友发mail来问我
玄学!?相同的代码在不同的IDE下运行结果不同。
这是在codeblocks下运行的结果、这是在Devc++运行的结果代码一模一样 , 运行出来的结果不同???怎么解决呢?我换过编译器,也换过codeblocks的版本,但结果都是这样不知道你们的运行结果是哪个?Devc++出的结果才是正确的答案啊、代码我放这里了,有codeblocks的伙伴试试你的结果。本人还测试了在ubuntu下16.01的codeblock运行与dev相同。目前看来是GCC...
程序直接运行和用gdb单步执行结果不同
前段时间调试代码时发现  程序直接运行的结果怎么都不正确,  但使用gdb单步执行时结果却总是正确的。 最开始以为使用gdb单步执行与程序直接运行的区别无非就是对多线程的影响,可查来查去没有发现线程安全问题。 后来仔细梳理了现象并啃了一遍代码后才发现,gdb单步执行也会对网络io产生影响。 我当时的现象就是: 直接运行时,读到的HTTP响应总是只有head没有body;
VS中DEBUG和RELEASE运行结果不一样
在使用VC开发软件的过程中,正当要享受那种兴奋的时候突然发现:release与debug运行结果不一致,甚至出错,而release又不方便调试,真的是当头一棒啊,可是疼归疼,问题总要解决,下面将讲述一下我的几点经验,看看是不是其中之一: 1. 变量。 大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1),而release的赋
C++ Debug 和 Release 运行结果不同
VS2008 Debug 和 Release 版本程序运行结果不同的可能原因小结
打印结果和调试结果不一样(C语言)
【0】README0.1)本文旨在阐述 个人的debug经历,遇到的各种debug 奇葩问题, 说是奇葩,其实也是自己 不小心或者说是编程习惯不好;【1】debug和running的运行结果不一致(乍眼一看,你肯定醉了)1.1)原因:这是因为, 运行是时候,temp内部分配失败,为null, 所以直接返回了,所以swap失败;而在debug的时候, temp内存分配成功, 不为null, 所以swa
比特差错、传输差错
比特差错:帧内部比特位出现错误,可以通过帧的FCS(方法:CRC检验)序列保证无比特差错 传输差错:帧丢失、帧重复、帧失序 在数据链路层使用CRC检验,能够实现无比特差错的传输,但这还不是可靠传输
小波变换C++源码
小波变换的C程序源码,编译通过,无问题。
程序每次运行结果不一样
<br />今天做软件更新图标的时候,遇到的一个看起来很奇怪的问题,便是显示的图标每次都不一样。后来查了半天,发现是自己写的代码里面,寻找图标的索引值没有初始化的结果,所以导致每次看起来的图标均不一样。<br />这些细节问题看似很不经意,却比较容易引用未知的错误。告戒自己以后写代码一定要养成好习惯!做一次宝贵的经验记下吧。
openmp开启后计算结果错误原因
openmp多线程使用方法十分简单,一般对于for循环只需要加一句#pragma omp parallel for就可以了。新手使用的时候有时候可能会出现开启omp之后,得到的计算结果是错的,而且多次执行结果还不相同。1.   其中一个可能的原因是你的代码中不同的线程同时使用某一内存的值并且试图改变它,比如累加操作,这种情况下线程x获取的数据可能不是最新的。示例1:参考https://www.cn...