鱼C论坛

 找回密码
 立即注册
查看: 1519|回复: 4

[已解决]有关实型数据的一点疑惑

[复制链接]
发表于 2017-5-29 18:50:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

第1题计算    1.0/3*3  ,结果是  1.000000
第2题计算     3/2  ,  结果是   0.000000
第3题计算    1/3*3,  结果是0.000000

为什么小数点后面是6个0?
为什么第2题第3题计算结果绝对值都是0呢?体现了什么知识点?

谢谢啦,嘿嘿

下面附上我的代码
第1题
  1. #include <stdio.h>
  2. void main()
  3. {
  4.         printf("%f\n",1.0/3*3);
  5. }
复制代码


第2题
  1. #include <stdio.h>
  2. void main()
  3. {
  4.         printf("%f\n",3/2);
  5. }
复制代码


第3题
  1. #include <stdio.h>
  2. void main()
  3. {
  4.         printf("%f\n",1/3*3);
  5. }
复制代码
最佳答案
2017-6-4 10:07:07
本帖最后由 Hacker_Jack 于 2017-6-4 10:08 编辑
reg163 发表于 2017-6-2 20:44
那第2题怎么也会是1吧??怎么会是0


由于在printf中float 与double均使用%f输出,所以float会先被转化为double的长度再输出(32 bits - > 64 bits),而int不属于float也不属于double,所以请想象一下,在输出精度有限的情况下一个值为1的整数在64位内存中是什么样子,0000............(省略几十个0)......001,而且请看,64位浮点数的存放方式:
     以int a=0x40f00000为例,这个可比你那个1要大多了  
           63位                 62~52位                 51~0位
        1个符号位        11个阶数                 52个尾数
        从0x0000000040f00000来看
        1)符号位是0,表示正
        2)阶数是0,表示-1023 + 1023 = 0,用指数表示:1.#*2^-1023,‘#’是代表尾数。
        3)尾数就是,0x0000040f00000
        4)浮点二进制表示
2#1.0000000000000000000001000000111100000000000000000000*2^(-1023),-1023次方可想而知有多小。
输出精度本来就不高,怎么可能见得到你小数点那么后面的那个1,当然只能看到0
总之就是浮点数内部处理的机制与整型是完全不同的,不要想着拿%f强行输出int。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-30 12:53:44 | 显示全部楼层
涉及的知识点是隐式类型转换,还有类型规则,在进行计算时,低类型会自动提升为高类型,就是int与float一起算,结果会为float,整型在计算后会舍弃掉小数,就算你把输出设置为浮点型也没用,在输出前小数部分已经被舍弃了,这些基础建议楼主自己看看甲鱼的教程或者是任何的C语言书,都是很常见很简单的。你的系统默认的输出可能就是6位,试试看%.2f,应该只有两位了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-2 20:44:13 | 显示全部楼层
Hacker_Jack 发表于 2017-5-30 12:53
涉及的知识点是隐式类型转换,还有类型规则,在进行计算时,低类型会自动提升为高类型,就是int与float一起 ...

那第2题怎么也会是1吧??怎么会是0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-4 10:07:07 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Hacker_Jack 于 2017-6-4 10:08 编辑
reg163 发表于 2017-6-2 20:44
那第2题怎么也会是1吧??怎么会是0


由于在printf中float 与double均使用%f输出,所以float会先被转化为double的长度再输出(32 bits - > 64 bits),而int不属于float也不属于double,所以请想象一下,在输出精度有限的情况下一个值为1的整数在64位内存中是什么样子,0000............(省略几十个0)......001,而且请看,64位浮点数的存放方式:
     以int a=0x40f00000为例,这个可比你那个1要大多了  
           63位                 62~52位                 51~0位
        1个符号位        11个阶数                 52个尾数
        从0x0000000040f00000来看
        1)符号位是0,表示正
        2)阶数是0,表示-1023 + 1023 = 0,用指数表示:1.#*2^-1023,‘#’是代表尾数。
        3)尾数就是,0x0000040f00000
        4)浮点二进制表示
2#1.0000000000000000000001000000111100000000000000000000*2^(-1023),-1023次方可想而知有多小。
输出精度本来就不高,怎么可能见得到你小数点那么后面的那个1,当然只能看到0
总之就是浮点数内部处理的机制与整型是完全不同的,不要想着拿%f强行输出int。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-4 17:13:13 | 显示全部楼层
Hacker_Jack 发表于 2017-6-4 10:07
由于在printf中float 与double均使用%f输出,所以float会先被转化为double的长度再输出(32 bits - > 6 ...

完美的回答。膜拜下,谢谢大佬细心回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 21:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表