一:在我的编译器中单精度浮点型和双精度浮点型显示时为何都只能精确到小数点后六位?不是说双精度比单精度更精确吗?既然都是六位,精确性的对比体现在哪里?二:程序如下,运行结果如下我知道运行结果中只有左上角和右下角的数据是正确的。
#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分。真心感谢,预祝各位新年快了。
既然float的有效数字是6-7位
double的有效数字是15到16位
那为什么在运行结果中显示的都是只有小数点后六位呢?
ANSI C 并未具体规定每种类型数据的长度、精度、数值范围,
有的系统将double所增加的32位全用于存放小数部分,这样可以增加数值的有效范围,减少舍入误差。
有的系统则将所增加的位(bit)一部分存放指数部分,这样可以扩大数值范围
我是不是可以猜测我的系统将所增加的位用来存放指数部分了?因为我的电脑上两种数据类型的有效范围是一样的,都是小数点后六位。
同样,您的意思是说:在有的电脑或系统上,会存在double类型数据的小数点后位数远比float小数点后的位数多的现象。您是这个意思吗?
是的··
还有个默认输出的问题
你看看这个 float小数点后6位就不可靠了
那您如何看待上面网友说的“显示小数点后六位是printf()规定的”的说法呢?是不是这里的printf()函数就等价于您所说的“系统”,难道是用不同的输出函数,显示的精度就不同?是这样的吗?
追答这个也是一个方面
你可以把数据再加长试试 比如小数点后20位 用两种数据类型输出试试
嗯 照这样看 double精度就是float 的两倍
可以这样理解:都是表示小数,但表示的精度(或者范围)不同。
单精度:小数点后面可以跟7位,如1.234567;
双精度小数点后面的数是单精度的两倍即14位,如1.235412644154412
超过后面位数的数字就是无效值了
两倍?怎么看的?printf()函数的作用是规定输出数据精确到小数点后多少位,就像您写的是显示显示小数点后20位,但是明明赋值时明明有20位,为何a的值正确显示的只有小数点后4位(小数点后第五位是5,不正确)?为何b的值正确显示的只有小数点后13位?
是不是赋值时虽然有20位,但是赋值后系统储存时,对float类型的数据只进行读取小数点后4位进行储存,然而却对double类型的数据进行读取小数点后13位进行储存?
是的 因为放不下 我指定输出20位
超过他们存储的值 就属于不可靠随机无效值了
谢谢,祝您新年快乐,假如我对这个问题有新疑问时再继续追问您,请您继续关注,真心感谢!
“float和double显示的小数部分都一样,都是小数点后六位”这是人为规定的?好的,这一点知道了。但是,您说二者的整数部分不同,这是什么意思呢?能举个例子吗?真心感谢了
追答因为double占用的字节数比float多啊(虽然也有的系统这两个一样多,也就是完全一样)
小数点后都是六位了,多出来的那部分就体现在整数部分了啊,这样double型数据表示的数范围就比float大了
您的意思是说二者的整数部分的取值范围不同,是吗?
追答嗯,是的。其实楼上已经说过了,double和float没有强制的规定的,不同的系统都不一样。有的系统double和float也是一样的,也就是说都是32位。一般情况是double64位,float32位。
我不了解printf函数,所以无法提出新的问题,我先去了解一下,稍后再来,请您继续关注,祝新年开心!
追答简单地说,你不用.prec指定精度,printf()函数就会显示6位小数,所以你看不出区别。
追问这个知识点我懂了,非常感谢您,真心感谢
在VC++6.0上使用c语言编程,单精度浮点型和双精度浮点型为何都只能精确到...
其实就是有效位数不一样。浮点型变量分为单精度(float)、双精度(double)和长双精度(long double)3类。在Turbo C 中:比特(位)数 有效数字 float 32 6-7 double 64 15-16 long double 128 18-19 ANSI C 并未具体规定每种类型数据的长度、精度、数值范围,有的系统将double所增加的32位全...
c语言单精度
在计算机编程中,C语言提供了两种类型的浮点数:单精度(float)和双精度(double)。它们的主要区别在于表示精度和内存占用。简单来说,double的精度要优于float,体现在小数点后的位数上。float通常表示的小数点后只有7位,而double则可以达到16位,这使得double在进行精确数学计算时更为适用。float在内存中...
C语言四舍五入的问题???
没能正确地做四舍五入是因为有效数字个数超出 double 允许范围,尾部数据不精确了。有效数字少一点时,我的编译器(VC++ 6.0) 好像能做四舍五入。例如:include<stdio.h> include<stdlib.h> main(){ double a,b,c,d;a=1.12345;b=-1.12345;c=1.12344;d=-1.12344;printf("a=%.4lf ...
C语言中浮点数float和double输出的问题
精度是说某种类型的浮点数在C中计算时有多少位是有效的,这实际上是包括整数部分的,但不包括小数点那一位;而输出小数点后多少位是由输出函数printf中的控制字符串确定的。float的精度是6到7位,就是说连整数部分有6位是可信的,再长了就是机器垃圾值了;double有16到17位是可信的,再多了也是机...
关于C语言 双精度 单精度 的问题
该题其实考察的不是精度问题,是整数和浮点数之间的运算问题,结果没有错误,以后向这种问题你可以上机运行一下呀,一看结果就什么都明白了,首先你说的精度是指精确度,并不是保留小数的位数,这两个概念不同,你可能弄混了,而输出的时候,double和float默认都是保留六位,我就再这里给你解释一下这...
单精度和双精度有什么不同?
1,单精度浮点型为float, 双精度浮点型为double。2,Float为单精度,内存中占4个字节,有效数位是7位(因为有正负,所以不是8位),在我的电脑且VC++6.0平台中默认显示是6位有效数字。3,double为双精度,占8个字节,有效数位是16位,但在我的电脑且VC++6.0平台中默认显示同样是6位有效数字。...
举例说明c语言中单精度型和双精度型float与double的用法区别,谢谢!
float单精度,在内存中只占32bit,而duoble类型占64bit.浮点型变量在内存中分三个部分构成,分别是标记,指数和尾数。folat在标记位中占了1bit.在指数中占8bit.在尾数中占23bit duoble在标记中占了2bit.在指数中占了10bit.在尾数中占了52bit.所以duoble的小数位数和运算小数的速度远比folat强 ...
c语言中单精度浮点型和双精度浮点型分别可以保留几位小数
C语言中,双精度浮点(double)型,占8 个字节(64位)内存空间。其数值范围为1.7E-308~1.7E+308,双精度完全保证的有效数字是15位,16位只是部分数值有保证,而单精度保证7位有效数字,部分数值有8位有效数.
c++中单精度浮点跟双精度浮点怎么区分
当表中需要存储精度较高、位数固定的数值或者存储真正的浮点数值时请使用双精度型数据代替数值型数据 单精度浮点型是为了提供兼容性,浮点数据类型在功能上等价于数值型。 追问: 套用这题,如果double改成float行不行 回答: float是16位,double32位,没超过16位就可以用float ...
c++中单双精度再编程中怎样确定?简单通俗的来。
单精度精度相对比较小,但相对来说比较快,只是在PC上有硬件浮点运算器实现时相差可能相对不明显。对于性能较低(嵌入式设备)或效率要求很高的场合(例如字形渲染),应该尽可能自定义的定点数代替浮点数,即使因为复杂性等原因而不得不用浮点数,也尽可能用单精度代替双精度(除非精度要求很高或者范围很大...