我在看一本C语言的书时遇见了一个问题 帮忙解释一下 3Q
是这么写的:许多C编译系统将实型常量作为双精度处理。例如已定义一个实型变量f,有如下语句:f=2.45678*4523.65系统将2.45678和4523.65按双精度数...
是这么写的: 许多C编译系统将实型常量作为双精度处理。例如已定义一个实型变量f,有如下语句: f=2.45678*4523.65
系统将2.45678和4523.65按双精度数据存储(占64位)和运算,得到的双精度的乘积,然后取前七位赋给实型变量f。这样可以保证计算更精确。
*************************************************
我不理解的是得到的乘积不是11113.612847吗 可是这个范围属于单精度啊 ,为什么一直用双精度,对于这类概念我很迷糊 ,哪位高手能给我指点指点 感激不尽。解释越详细越容易明白越好 谢谢
想在麻烦解释一下 上面说 “然后取前七位赋给实型变量f,这样可以保证计算更精确”为什么这样就能计算更精确呢,还有他说的前七位是什么前七位 。。 我越看越糊涂了.. 你们看我的提问 能知道我哪个地方没学好哪里不明白吗 我自己都不知道我要问什么了~ 无奈 就是知道不理解! 展开
系统将2.45678和4523.65按双精度数据存储(占64位)和运算,得到的双精度的乘积,然后取前七位赋给实型变量f。这样可以保证计算更精确。
*************************************************
我不理解的是得到的乘积不是11113.612847吗 可是这个范围属于单精度啊 ,为什么一直用双精度,对于这类概念我很迷糊 ,哪位高手能给我指点指点 感激不尽。解释越详细越容易明白越好 谢谢
想在麻烦解释一下 上面说 “然后取前七位赋给实型变量f,这样可以保证计算更精确”为什么这样就能计算更精确呢,还有他说的前七位是什么前七位 。。 我越看越糊涂了.. 你们看我的提问 能知道我哪个地方没学好哪里不明白吗 我自己都不知道我要问什么了~ 无奈 就是知道不理解! 展开
4个回答
展开全部
首先关于浮点数的精度,楼主及然知道float是32位,那么你是否知道浮点数在计算机中是怎么表示的?
参考这里:http://baike.baidu.com/view/339796.html?wtp=tt
是通过数符± 尾数m 阶符± 阶码e表示的,而这四个东西一共占有32位
你说的单精度的范围,是指其表示数的最大范围,而不是精度范围,比如1.xxx(小数点后100位)是不是也在float的范围内,但你看能表示的了么?
32位中尾数的位数决定了其精度,而阶码的位数决定了其范围
11113.612847这数字,我们可以算成2进制10101101101001.10010101100111101111,我的计算器不太好,可能不太准,但是你可以看出,其表示光尾数至少需要35位,很明显float表示不了
参考这里:http://baike.baidu.com/view/339796.html?wtp=tt
是通过数符± 尾数m 阶符± 阶码e表示的,而这四个东西一共占有32位
你说的单精度的范围,是指其表示数的最大范围,而不是精度范围,比如1.xxx(小数点后100位)是不是也在float的范围内,但你看能表示的了么?
32位中尾数的位数决定了其精度,而阶码的位数决定了其范围
11113.612847这数字,我们可以算成2进制10101101101001.10010101100111101111,我的计算器不太好,可能不太准,但是你可以看出,其表示光尾数至少需要35位,很明显float表示不了
展开全部
双精度,实际上是将实数保留15或16个有效数字后存储
单精度,只是将实数保留7到8个有效数字存储
vc规定,所有实数都是按照double来使用,同时都是按照指数形式才存储
例如:
float a=1.0;
实际上是吧double型的1.0(16个有效数字,自己加0去),去掉后面的精度,只保留7或8个有效数字写入变量a
同样的,
float a=1.0;
double b=a;
是吧float型的a中存储的实数1.0取出,扩充至16个有效数字,然后写入变量b
总而言之,个人感觉,这两种类型,除了字节数不同,精确程度不同外,用起来的话几乎没有什么影响
单精度,只是将实数保留7到8个有效数字存储
vc规定,所有实数都是按照double来使用,同时都是按照指数形式才存储
例如:
float a=1.0;
实际上是吧double型的1.0(16个有效数字,自己加0去),去掉后面的精度,只保留7或8个有效数字写入变量a
同样的,
float a=1.0;
double b=a;
是吧float型的a中存储的实数1.0取出,扩充至16个有效数字,然后写入变量b
总而言之,个人感觉,这两种类型,除了字节数不同,精确程度不同外,用起来的话几乎没有什么影响
追问
在请问一下 1.0还分float型跟double型吗? 这样的分有何意义 0属于有效数字吗?你说的去掉后面的精度 我还是不太理解呢
追答
1.0就是1.0,你说他是1.000000也好,说他是1.000000000000000000000也好,总之他是不会变的。
但是在c中,1.0是实型常量,按照c的规则是按照double来使用的。
所谓有效数字,就是我觉得1.0不够精确,人为在后面追加几个0罢了。
或者是3.14159265太长了,不好用,按照3.14来使用。
至于你一开始问的那个,我这么问,保留16个有效数字的1.000000000000000,你会写这么多0吗?还不是一个1.0搞定。习惯问题罢了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
double * double=float?
更多追问追答
追问
f=2.45678*4523.65
这个不是是两个float相乘吗
追答
字面值常量编译器认为是double,如果想定义为float,那么f=2.45678f*4523.65f
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
单精度float精确到6位,双精度double15位,不过c中大多情况是隐式转换把float型转化为double型来计算我不知道你是怎么判断11113.612847是单精度的。
更多追问追答
追问
里面说 单精度(float型)32位 有效数6~7 数值范围10^-37~10^38 不是说 数值范围是 10^-37~10^38吗 11113.612847 不是在10^-37~10^38的范围之内吗 为什么说是双精度呢
追答
我觉得这个范围是IEEE的精确范围,可又不像。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询