有关实型数据的一点疑惑
第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);
} 涉及的知识点是隐式类型转换,还有类型规则,在进行计算时,低类型会自动提升为高类型,就是int与float一起算,结果会为float,整型在计算后会舍弃掉小数,就算你把输出设置为浮点型也没用,在输出前小数部分已经被舍弃了,这些基础建议楼主自己看看甲鱼的教程或者是任何的C语言书,都是很常见很简单的。你的系统默认的输出可能就是6位,试试看%.2f,应该只有两位了。 Hacker_Jack 发表于 2017-5-30 12:53
涉及的知识点是隐式类型转换,还有类型规则,在进行计算时,低类型会自动提升为高类型,就是int与float一起 ...
那第2题怎么也会是1吧??怎么会是0 本帖最后由 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。 Hacker_Jack 发表于 2017-6-4 10:07
由于在printf中float 与double均使用%f输出,所以float会先被转化为double的长度再输出(32 bits - > 6 ...
完美的回答。膜拜下,谢谢大佬细心回答
页:
[1]