在VC++6.0上使用c语言编程,单精度浮点型和双精度浮点型为何都只能精确到小数点后六位?
一:在我的编译器中单精度浮点型和双精度浮点型显示时为何都只能精确到小数点后六位?不是说双精度比单精度更精确吗?既然都是六位,精确性的对比体现在哪里?二:程序如下,运行结果...
一:在我的编译器中单精度浮点型和双精度浮点型显示时为何都只能精确到小数点后六位?不是说双精度比单精度更精确吗?既然都是六位,精确性的对比体现在哪里?二:程序如下,运行结果如下我知道运行结果中只有左上角和右下角的数据是正确的。
#include<stdio.h>int main(void){ float a; double b;
a=333.6666666666; b=444.6666666666; printf("a=%f,b=%f\n",a,b); printf("a=%lf,b=%lf\n",a,b);
return 0;}
请依次解释运行结果中的四个数据。
疑问一:为何显示的是这四个数据,请以此四个数据为例依次从字节,位(顺便详细讲一下符号位,指数位,尾数位),二进制与十进制间的互化,由浅入深,再由深到浅的详细讲解为何最终显示的是这四个数据。
疑问二:为何最终显示的都是小数点后六位?double比fioat的精确性体现在哪里?
疑问三:为何有个数居然是333.666656?根本不符合四舍五入
题外话:我不是随便求大神的人,因为我知道没有自己的思考绝对没有进步,而且大神都很忙,关于这个问题,我查了很多资料,可是,一周过去了,仍然没有得到答案。还望诸位详细解说,为同为这个问题迷茫的人指点迷津,谢谢,我会逐渐提高悬赏的,直到达到最高悬赏200分。真心感谢,预祝各位新年快了。 展开
#include<stdio.h>int main(void){ float a; double b;
a=333.6666666666; b=444.6666666666; printf("a=%f,b=%f\n",a,b); printf("a=%lf,b=%lf\n",a,b);
return 0;}
请依次解释运行结果中的四个数据。
疑问一:为何显示的是这四个数据,请以此四个数据为例依次从字节,位(顺便详细讲一下符号位,指数位,尾数位),二进制与十进制间的互化,由浅入深,再由深到浅的详细讲解为何最终显示的是这四个数据。
疑问二:为何最终显示的都是小数点后六位?double比fioat的精确性体现在哪里?
疑问三:为何有个数居然是333.666656?根本不符合四舍五入
题外话:我不是随便求大神的人,因为我知道没有自己的思考绝对没有进步,而且大神都很忙,关于这个问题,我查了很多资料,可是,一周过去了,仍然没有得到答案。还望诸位详细解说,为同为这个问题迷茫的人指点迷津,谢谢,我会逐渐提高悬赏的,直到达到最高悬赏200分。真心感谢,预祝各位新年快了。 展开
3个回答
展开全部
其实就是有效位数不一样。
浮点型变量分为单精度(float)、双精度(double)和长双精度(long double)3类。在Turbo C 中:
比特(位)数 有效数字
float 32 6-7
double 64 15-16
long double 128 18-19
ANSI C 并未具体规定每种类型数据的长度、精度、数值范围,有的系统将double所增加的32位全用于存放小数部分,这样可以增加数值的有效范围,减少舍入误差。有的系统则将所增加的位(bit)一部分存放指数部分,这样可以扩大数值范围
浮点型变量分为单精度(float)、双精度(double)和长双精度(long double)3类。在Turbo C 中:
比特(位)数 有效数字
float 32 6-7
double 64 15-16
long double 128 18-19
ANSI C 并未具体规定每种类型数据的长度、精度、数值范围,有的系统将double所增加的32位全用于存放小数部分,这样可以增加数值的有效范围,减少舍入误差。有的系统则将所增加的位(bit)一部分存放指数部分,这样可以扩大数值范围
更多追问追答
追问
既然float的有效数字是6-7位
double的有效数字是15到16位
那为什么在运行结果中显示的都是只有小数点后六位呢?
追答
ANSI C 并未具体规定每种类型数据的长度、精度、数值范围,
有的系统将double所增加的32位全用于存放小数部分,这样可以增加数值的有效范围,减少舍入误差。
有的系统则将所增加的位(bit)一部分存放指数部分,这样可以扩大数值范围
展开全部
双精度和单精度的不同在于字节数,从而决定了存储数据的范围不同。但是你那里小数点后都是六位,这个是人为规定的,不同之处在于小数点前也就是整数部分,小数部分都一样。有问题可以再问
更多追问追答
追问
“float和double显示的小数部分都一样,都是小数点后六位”这是人为规定的?好的,这一点知道了。但是,您说二者的整数部分不同,这是什么意思呢?能举个例子吗?真心感谢了
追答
因为double占用的字节数比float多啊(虽然也有的系统这两个一样多,也就是完全一样)
小数点后都是六位了,多出来的那部分就体现在整数部分了啊,这样double型数据表示的数范围就比float大了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你这就犯了想当然的错误,你调用printf()函数却不去查看printf()函数的源代码或者用法。
查看printf()函数说明
int printf(const char *format,[argument]);
format 参数输出的格式,定义格式为:%[flags][width][.perc][F|N|h|l]type
其中
4.prec 用于控制小数点后面的位数,取值和含义如下:
无 按缺省精度显示
你不写精度就是默认精度6位。
查看printf()函数说明
int printf(const char *format,[argument]);
format 参数输出的格式,定义格式为:%[flags][width][.perc][F|N|h|l]type
其中
4.prec 用于控制小数点后面的位数,取值和含义如下:
无 按缺省精度显示
你不写精度就是默认精度6位。
更多追问追答
追问
我不了解printf函数,所以无法提出新的问题,我先去了解一下,稍后再来,请您继续关注,祝新年开心!
追答
简单地说,你不用.prec指定精度,printf()函数就会显示6位小数,所以你看不出区别。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询