Chulainn 发表于 2017-5-29 18:50:37

有关实型数据的一点疑惑


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

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

谢谢啦,嘿嘿

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

第2题
#include <stdio.h>
void main()
{
        printf("%f\n",3/2);
}

第3题
#include <stdio.h>
void main()
{
        printf("%f\n",1/3*3);
}

Hacker_Jack 发表于 2017-5-30 12:53:44

涉及的知识点是隐式类型转换,还有类型规则,在进行计算时,低类型会自动提升为高类型,就是int与float一起算,结果会为float,整型在计算后会舍弃掉小数,就算你把输出设置为浮点型也没用,在输出前小数部分已经被舍弃了,这些基础建议楼主自己看看甲鱼的教程或者是任何的C语言书,都是很常见很简单的。你的系统默认的输出可能就是6位,试试看%.2f,应该只有两位了。

reg163 发表于 2017-6-2 20:44:13

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

那第2题怎么也会是1吧??怎么会是0

Hacker_Jack 发表于 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。

reg163 发表于 2017-6-4 17:13:13

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

完美的回答。膜拜下,谢谢大佬细心回答
页: [1]
查看完整版本: 有关实型数据的一点疑惑