C语言:双精度与单精度是包含关系吗?那么我能所有的数都用双精度表标吗?

作者&投稿:标欢 (若有异议请与网页底部的电邮联系)
C语言单精度与双精度问题~

double
C;
scanf("%lf",&C);
printf("摄氏温度是:%20.17lf
",C);
floate
C,
scanf("%f",&C);
printf("摄氏温度是:%20.17f
",C);
这两段程序运行时输入
10.12345678912345,你可以看出单精度

双精度的差别。

double C;
scanf("%lf",&C);

printf("摄氏温度是:%20.17lf
",C);


floate C,
scanf("%f",&C);
printf("摄氏温度是:%20.17f
",C);


这两段程序运行时输入 10.12345678912345,你可以看出单精度 和 双精度的差别。

不是包含关系哈!单精度,顾名思义,精度较低。双精度,精度较高。当你需要高精度的时候,就用双精度,但双精度有个缺点,占用内存比单精度多些(双精度8个字节,单精度4个字节),当程序很大时,用双精度编的程序运行用的时间比较多,所以再不必需要高精度时,就用单精度。实型是单精度和双精度的统称,实型和整型在内存里的存储形式不一样。长整型在内存中占4个字节,短整型占2个字节,所以,长整型所表示的数值范围比短整型广。
对啦!我还是提醒你一句:学c语言不要在意语法,有个大概的了解就行啦,不然学不好的,c语言重要的是算法。我以前也是你这样学c语言,所以没学好,后来我改了,才把c语言学好的,不信,你把谭浩强编的《c程序设计》那本教材的前言看一下,那里有教你怎样学c语言的方法,我觉的谭浩强说得很对。祝你能学好c语言!

靠, 并不是答案长就一 定是对呀~!~!
我来说说吧 ~!
1.双精度与单精度的区别在于它们的数值范围不同,也就是说双精度比单精度的范围大,还有就是双精度比单精度所占空间也大,双精度占8字节,只占单精度4字节呀!用时只要适当就行~!
2.实型和整型也很好区分呀!~
整形在于它是一个整数,记住这就行 了~!
同样的,实型在于它是一个小数,当然也可以表示一个整数,比如说整数3,实数就是3.0了 !~
在应用时,要看自己的需要了~!
比如说: 要是成绩的话,就要用到实型了。
要是年龄的话就是整形了 !~
3.长整型与短整型也是范围、占用空间不同,长整型比短整型范围大,长整型的占用空间为4字节,而短整型只占用2字节空间~!
OK!

先回答你的问题:双精度与单精度是包含关系,双精度的数不能表示所有的数(如果超出它的表示范围),看场合用单度,双精度,整型(好像没实型这个数据类型吧),长整型和短整型区别是它们的表示范围不同。

下面是这些数据类型的表示范围:
int -32768~32767
short int -32768~32767 //整型和短整型是一样的
signed int -32768~32767
unsigned int 0~65535 //无符号数
long int -2147483648~2147483647
unsigned long 0~4294967295

在Turbo C中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。双精度型占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。

也没什么好多说的了,反正就是看场合用了,如要计数,可用整型;要用到小数时,用浮点型;至于什么时候用长整型或整型,单精度或双精度,就要你所用到的数据大小了,如果超过了整型 的表示范围,就得用长整型 了.

单精度和双精度数值类型最早出现在C语言中(比较通用的语言里面),在C语言中单精度类型称为浮点类型(Float),顾名思义是通过浮动小数点来实现数据的存储。这两个数据类型最早是为了科学计算而产生的,他能够给科学计算提供足够高的精度来存储对于精度要求比较高的数值。但是与此同时,他也完全符合科学计算中对于数值的观念:

当我们比较两个棍子的长度的时候,一种方法是并排放着比较一下,一种方法是分别量出长度。但是事实上世界上并不存在两根完全一样长的棍子,我们测量的长度精度受到人类目测能力和测量工具精度的限制。从这个意义上来说,判断两根棍子是否一样长丝毫没有意义,因为结果一定是False,但是我们可以比较他们两个哪个更长或者更短。这个例子很好地概括了单精度/双精度数值类型的设计初衷和存在意义。

基于上述认识,单精度/双精度数值类型从一开始设计的时候,就不是一个准确的数值类型,他只保证在他这个数值类型的精度之内是准确的,精度之外则不保证,比方说,一个数值5.1,很可能存储在单精度/双精度数值中的实际值是5.100000000001或者5.09999999999999。导致这个现象的原因我们可以通过两种方式来解释:

简单的解释方法:

你可以尝试在任何一个控件的属性面板中,设定他的宽度为:3.2CM,当你输入完毕后,你会发现值自动变成了3.199cm,无论你怎么改,你都无法输入3.200CM,因为实际上在电脑中存储的并不是CM为单位的数值,而是“缇”为单位的数值,而“缇”和CM之间的比值,是个很难被除尽的数,因此你输入完毕后,电脑自动转换成了最接近的“缇”值,然后再转换成厘米显示到属性面板上,这一乘一除,两次四舍五入,误差就出来了。单精度/双精度也是类似的原理,其实在二进制存储的时候,单精度/双精度都采用了类似相近分数的方法,而这样的存储是不可能做到准确的。

深入的解释方法:

让我们来看看我们存储到数字介质中的单精度/双精度值到底是怎么样的,我们使用如下代码对单精度类型进行一个解剖:

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Public Sub floatTest()
Dim dblVar As Single

dblVar = 5.731 / 8
dblOutput dblVar

dblVar = dblVar * 2
dblOutput dblVar

dblVar = dblVar * 2
dblOutput dblVar

dblVar = dblVar * 2
dblOutput dblVar

dblVar = dblVar * 2
dblOutput dblVar

dblVar = dblVar * 2
dblOutput dblVar

End Sub

Public Sub dblOutput(ByVal dblVar As Single)
Dim bytVar(3) As Byte
Dim i As Integer, j As Integer
Dim strVar As String

CopyMemory ByVal VarPtr(bytVar(0)), ByVal VarPtr(dblVar), 4
strVar = dblVar & ": "
For i = 3 To 0 Step -1
For j = 7 To 0 Step -1
strVar = strVar & (bytVar(i) And 2 ^ j) / 2 ^ j
Next j
strVar = strVar & " "
Next i
Debug.Print strVar

End Sub
运行后我们得到输出结果(输出格式为高位左,低位右):

.716375: 00111111 00110111 01100100 01011010
1.43275: 00111111 10110111 01100100 01011010
2.8655: 01000000 00110111 01100100 01011010
5.731: 01000000 10110111 01100100 01011010
11.462: 01000001 00110111 01100100 01011010
22.924: 01000001 10110111 01100100 01011010
这里,我们把单精度类型转化成了二进制数据输出,这里我们看到,虽然这六个数字完全不同,但是他们的二进制存储惊人地相似,我们看到红色标记部分,每次都是加1,事实上,单精度数据类型使用从高位开始第1位作为正负标记位(绿色),第2位到第9位,是一个跨字节的有符号字节类型数据,这个数值决定了小数点移动的方向和位数(红色),第10位到32位保存一个整数(蓝色)在存储过程中,电脑首先把输入的值不断移位(乘除2)直到这个数的整数部分占用了全部24位的整数位,然后把移动的位数写入浮点部分(红色),而移位后的结果写入整数部分(蓝色和绿色),小数部分则舍弃。求值的时候则是反向过程,先根据正负位和整数位求值,然后根据红色部分的整数来进行移位(乘除2的次方),最终才是我们得到的单精度数值。双精度数值也是同样原理,只是位数更多而已。

通过解剖单精度数值的二进制存储格式,我们可以清楚看到,实际上单精度/双精度的存储,都要通过乘法和除法,其中必有舍入,如果恰好你的数值在除法中被舍入了,那么你赋的初值就很可能与你最终存储的值不完全相同,其中的微小差异,并不与单精度/双精度的设计目标相违背。

当我们在数据库中或者VBA代码中使用一个单精度/双精度数值的时候,也许你从界面上看不到区别,但是在实际的存储中,这个差别却真真切切地就在那里,当你对其进行相等比较的时候,系统只是简单地作二进制的比较,界面上无法体现的微小差异,在二进制比较面前却无处遁形,于是,你的等于比较返回了一个意料之外的False。

1 实型数据在内存中的存放形式
实型数据在内存中占4个字节(32)位。按照指数形式存贮。
系统把实型数据分成小数部分和指数部分。如实数3.6547的
存放形式如图所示:

+ .36547 1

数符 小数部分 指数

+ .36547 * 10^1->3.6547

实型变量包括单精度型,双精度型,长双精度型

2 以下是各类型数的表示范围:
int 字节4 数值范围:-2147483648~+2147483647
长整型 long 字节4 数值范围 -2147483648~+2147483647
float 字节4 数值范围 3.4×10^-38~3.4×10^38
double 字节8 数值范围 1.7×10^-308~1.7×10^308
短整型 short 字节2 数值范围 -32768~+32767
long 字节4 数值范围 -2147483648~+2147483647

double表示的范围要比float大很多,精度要高,看你实际情况自己选择,当你想输出结果保留的精度要更高,就选择double,根据你想保留多少位有效数字而实际选择
看区别:
float的精度是6位有效数字,取值范围是10的-38次方到10的38次方,float占用4字节空间

double的精度是15位有效数字,取值范围是10的-308次方到10的308次方,double占用8字节空间。

实型跟整型不是同一类数据,当你想输出结果是整数的时候,当然要int类型,
长整型跟短整型就是取值范围的不同。

一切都是根据你想输出的结果而又效的选择数据类型

C语言:双精度与单精度是包含关系吗?那么我能所有的数都用双精度表标吗...
答:不是包含关系哈!单精度,顾名思义,精度较低。双精度,精度较高。当你需要高精度的时候,就用双精度,但双精度有个缺点,占用内存比单精度多些(双精度8个字节,单精度4个字节),当程序很大时,用双精度编的程序运行用的时间比较多,所以再不必需要高精度时,就用单精度。实型是单精度和双精度的...

c语言中什么是单精度型和双精度型???各举个例子。。。
答:单精度数(float型)在32位计算机中存储占用4字节,也就是32位,有效位数为7位,小数点后6位;双精度数(double型)在32位计算机中存储占用8字节,也就是64位,有效位数为16位,小数点后15位。比如3.1415926535897932384这个小数,如果定义成float型,那么只会留下小数点后5位,也就是3.141592,如果...

c语言中单精度和双精度是什么
答:单精度和双精度是这对浮点运算来说的,也就是通常说的小数,单精度浮点最少有小数点后6位,双精度至少是小数点后10位,应为编译器或者平台不同说以小数点后面多少位是不同的,当是C语音已经规定了小数点后几位最小的值,最大有多少要看具体的系统来定 ...

C语言中的 单精度型 和双精度型是什么意思
答:双精度是1位符号,11位指数,52位小数。

C语言中单双精度数表示什么意思?
答:c语言中单精度数和双精度数的本质区别在于数据类型所占的内存字节,浮点数,在C语言中使用的是IEEE754浮点数编码,该标准规定了单精度浮点数和双精度浮点数所占的内存字节,一般单精度数占用4个字节,双精度数占用8个字节,扩展双精度数占用80个字节。IEEE754具体的标准如下:格式 长度 符号位 指数...

c语言里单精度和双精度怎么理解?
答:单精度和双精度顾名思义是两种精度的不同划分,单精度float是保证7位有效数字,double是保证16位有效数字。例:(float)(10%3)结果是1.000000即七位有效数字,(后面不一定全是0,计算机可随机选择数字,所以整数1不等于float或double的1)(double)(10%3)同理结果是:1.XXXXXXXXXX……后面有...

c语言中的float和double类型的区别是什么?单精度和双精度是什么?
答:单精度型 即 float 型, 有效数字约10进制7位 双精度型 即 double 型, 有效数字约10进制15位 所以能描述的数值精度不同。c语言 数据 用 IEEE 754 国际标准。float 型 用 4 字节存放,double 型 用 8 字节存放。Single Precision 2进制: 数符1位,指数8 位,尾数 23 位 Double ...

在C语言中的实型变量分为2种类型,它们是()和()
答:C语言提供的实型变量有两种类型:单精度(float)和双精度(double)。单精度数是指计算机表达实数近似值的一种方式。VB中Single(单精度浮点型)变量存储为 IEEE 32 位(4 个字节)浮点数值的形式,它的范围在负数的时候是从 -3.402823E38 到 -1.401298E-45,而在正数的时候是从 1.401298E-45...

什么是单精度和双精度?
答:单精度数是指计算机表达实数近似值的一种方式。VB中Single(单精度浮点型)变量存储为 IEEE 32 位(4 个字节)浮点数值的形式,它的范围在负数的时候是从 -3.402823E38 到 -1.401298E-45,而在正数的时候是从 1.401298E-45 到 3.402823E38 。双精度浮点数(double)是计算机使用的一种数据类型...

双精度与单精度浮点数的区别
答:不管是float还是double,在计算机中的存储都遵循IEEE规范,使用二进制科学计数法,都包含三个部分:符号位、指数位和尾数部分。其中float的符号位、指数位(即整数部分)、尾数部分分别为1. 8. 23.双精度则分别为1. 11. 52.从下图可以看出,单精度和双精度的精度和数值关系的函数中,双精度浮点动态范围...