C中的float和double的有效数字和精度各是多少?

发布网友 发布时间:2022-04-23 00:53

我来回答

9个回答

懂视网 时间:2022-04-08 12:11

double、float都是浮点型。double(双精度型)比float(单精度型)存的数据更准确些,占的空间也更大。double精度是float的两倍,所以需要更精确的计算常使用double。

单精度浮点数在机内占4个字节,用32位二进制描述。
双精度浮点数在机内占8个字节,用位二进制描述。

浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分。
数符占1位二进制,表示数的正负。
指数符占1位二进制,表示指数的正负。
尾数表示浮点数有效数字,0.xxxxxxx,但不存开头的0和点
指数存指数的有效数字。

指数占多少位,尾数占多少位,由计算机系统决定。
可能是数符加尾数占24位,指数符加指数占8位 -- float.
数符加尾数占48位,指数符加指数占16位 -- double.

知道了这四部分的占位,按二进制估计大小范围,再换算为十进制,就是你想知道的数值范围。

对编程人员来说,double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多,C语言中数学函数名称double 和 float不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)。     float与double的范围和精度

1. 范围
  float和double的范围是由指数的位数来决定的。
  float的指数位有8位,而double的指数位有11位,分布如下:
  float:
  1bit(符号位) 8bits(指数位) 23bits(尾数位)
  double:
  1bit(符号位) 11bits(指数位) 52bits(尾数位)
  于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024,并且指数位是按补码的形式来划分的。
  其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。
  float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。

2.  精度
  float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
  float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
  double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。

3.Oracle中Number类型

在Oracle中Number类型可以用来存储0,正负定点或者浮点数,可表示的数据范围在
1.0 * 10(-130) —— 9.9...9 * 10(125) {38个9后边带88个0}
的数字,当Oracle中的数学表达式的值>=1.0*10(126)时,Oracle就会报错。
Number的数据声明如下:
表示        作用        说明
Number(p, s)        声明一个定点数        p(precision)为精度,s(scale)表示小数点右边的数字个数,精度最大值为38,
Number(p)        声明一个整数        相当于Number(p, 0)
Number        声明一个浮点数        其精度为38,要注意的是scale的值没有应用,也就是说scale的指不能简单的理解为0,或者其他的数。

定点数的精度(p)和刻度(s)遵循以下规则:
?        当一个数的整数部分的长度 > p-s 时,Oracle就会报错
?        当一个数的小数部分的长度 > s 时,Oracle就会舍入。
?        当s(scale)为负数时,Oracle就对小数点左边的s个数字进行舍入。
?        当s > p 时, p表示小数点后第s位向左最多可以有多少位数字,如果大于p则Oracle报错,小数点后s位向右的数字被舍入

4.验证
create or replace function  func_test(p_type number) return number
is
/*
 功能:基于警度图数据同步
*/
 l_cnt number;
begin
 select p_type into l_cnt from dual;
 return l_cnt;
end func_test;
/
show err;

5.结论

number 的总长度是40位,其中可能包括:小数点,负号位。

select to_char(func_test(-987.12345671234567123456712345671234)) from dual;
-987.12345671234567123456712345679   //包括小数点及负号位共40位
select to_char(func_test(9876.12345671234567123456712345671234)) from dual;
9876.12345671234567123456712345679   //4位整数+小数点+35位小数=40位
select to_char(func_test(987.12345671234567123456712345671234)) from dual;
987.1234567123456712345671234567   //3位整数+小数点+36位小数=40位
select to_char(func_test(12345671234567123456712345671234)) from dual;
12345671234567123456712345671234   //40位整数
select to_char(func_test(123456712345671234567123456712345)) from dual;
1.2345671234567123456712345679E+40   //41位时精度发生丢失
1.2345671234567123456712345679×10^40 即 123456712345671234567123456700000

float和double的范围和精度,Oracle的Number类型

标签:

热心网友 时间:2022-04-08 09:19

float有效数字位为6 – 7位,字节数为4,指数长度为8位,小数长度为23位。取值范围为 3.4E-38~3.4E+38。

double有效数字位为15 – 16位,字节数为8,指数长度为11位,小数长度为52位。取值范围为1.7E-308~1.7E+308。

扩展资料

可根据应用程序的需求将变量声明为 float 或 double。这两种类型之间的主要差异在于它们可表示的基数、它们需要的存储以及它们的范围。如果存储比精度更重要,对浮点变量使用 float 类型。相反,如果精度是最重要的条件,则使用 double 类型。

浮点变量可以提升为更大基数的类型(从 float 类型到 double 类型)。当您对浮点变量执行算术时,通常会出现提升。此算术始终以与具有最高精度的变量一样高的精度执行。

参考资料来源:百度百科——浮点型数据



热心网友 时间:2022-04-08 10:37

float和double是有IEEE标准的,不是C语言定的,其它语言也一样。
double型90%的情况下有效位是16位的10进制数据是对的。来一段lua程序:
local b= 9007199254740991
print("b="..string.format("%d", b))
for i=1,10 do
print("i="..i..",b+i="..string.format("%d", b+i))--打印的全是偶数
end
for i=1,10 do
print("i="..i..",b-i="..string.format("%d", b-i))--打印正确
end
由此可见,大于9007199254740991(2进制52位最大的数),从2^53开始误差就大于1。

热心网友 时间:2022-04-08 12:11

float double
二进制有效位数 24位 53位
十进制有效位数 6或7位 15或16位
因为2进制转化到10进制不是整的1000或10000的那种...所以float6位7位都有,double15位16位都有。

热心网友 时间:2022-04-08 14:03

准确来说是2^-15.
double尾数占52位,2^-52=2.2204460492503130808472633361816e-16,即2^-16,所以能够保证所有的15位精度。

热心网友 时间:2022-04-08 16:11

float是32位,double是位
float32位中,有1位符号位,8位指数位,23位尾数为
double位中,1位符号位,11位指数位,52位尾数位
取值范围看指数部分
float是有符号型,其中,8位指数位,2^8=(-128—127),因此实际的范围是-2^128—2^127,约为-3.4E38—3.4E38
同理double范围约是-1.7E308—1.7E308,楼主可以自己按下计算器试试看,印象深些
精度是看尾数部分
float尾数位23位,2^23=8.3E6,7位,所以不同的编译器规定不同,有些是7位,有些8位
double尾数52位,2^52=4.5E15,15位,所以double的有效位数是15位
这是我个人的一点看法,纯手打,希望能帮到你

热心网友 时间:2022-04-08 18:35

由于默认小数最多显示6位,我这里整数6位 再强制让输出小数点后14位 共20位

见程序

float可靠数据 算上整数部分只有7位    而double 有16位

热心网友 时间:2022-04-08 21:17

float double
二进制有效位数 24位 53位
十进制有效位数 7位 15位

热心网友 时间:2022-04-09 00:15

楼上的答案基本上是对的,不过还是有点小瑕疵
计算机中的浮点数用的是IEEE754标准,它的规定中:
1.
阶码用的是8位的移码,但是偏移用的是127,而不是128,并且全0和全1的阶码有特殊含义,所以阶码的实际取值范围是[1,254],然后再减去127得[-126,127],而不是楼上说的[-128,127]
2.
尾数部分是23位显示存储,实际上,为了多一位精度,它有一个隐含的1做为小数点前一位数字,这就是科学计数法,即如果尾数为1100,实际上是代表1.1100,所以尾数实际上是24位
当然这些都不太影响楼上说的精度的啦2^24 约为10^(24*log2)=10^7,所以有效数是7位
大家可以去查一下IEEE 754浮点数标准,会更清晰些

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com