C语言有效位

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言有效位相关的知识,希望对你有一定的参考价值。

float的有效位为7位,这7位怎么算,包括小数点吗?是从小数点后面开始数7位,还是怎样?例如222223.523642566 输出是什么?

对于大小为32-bit的浮点数(32-bit为单精度,64-bit浮点数为双精度,80-bit为扩展精度浮点数),
1、其第31 bit为符号位,为0则表示正数,反之为复数,其读数值用s表示;
2、第30~23 bit为幂数,其读数值用e表示(就是lz所说的有效位)
3、第22~0 bit共23 bit作为系数,视为二进制纯小数,假定该小数的十进制值为x;

则按照IEEE 754的规定,该浮点数的值用十进制表示为:
= (-1)^s * (1 + x) * 2^(e - 127)

对于49E48E68来说,
1、其第31 bit为0,即s = 0
2、第30~23 bit依次为100 1001 1,读成十进制就是147,即e = 147。
3、第22~0 bit依次为110 0100 1000 1110 0110 1000,也就是二进制的纯小数0.110 0100 1000 1110 0110 1000,其十进制形式为0.78559589385986328125,即x = 0.78559589385986328125。

这样,该浮点数的十进制表示
= (-1)^s * (1 + x) * 2^(e - 127)
= (-1)^0 * (1+ 0.78559589385986328125) * 2^(147-127)
= 1872333

对于把具体的浮点值写成机器表示的IEEE浮点数的形式,过程与上面相反。另外还有NaN(Not a Number),Inf(无穷),指数为0时的非规格化数等概念,需要查看IEEE 754 标准或《深入理解计算机》这本经典著作。

参考资料:http://www.pediy.com/bbshtml/bbs3/Forum669.htm

参考技术A 注意一下,float型,有效位数是7位,但是保留6位有效小数
所以222223.523642566 输出222223.523643(最后一位四舍五入)本回答被提问者采纳
参考技术B 你理解错了,是二进制概念上的有效位,不是十进制。

你看看IEEE 754的标准就很清楚了。

C语言中的double是最多多少位?

我想知道C语言中的double的整数部分,最多可以有多少位?

双精度实数,占用字节8。

有效数字15~16(因为二进制转十进制问题)。

数值范围-1.7*10负308次方~1.7*10的308次方。

当有效数字全部是整数时,即整数有15~16位。

C语言中,输出double类型(双精度实型)以及float类型(单精度实型)时,默认输出6位小数(不足六位以 0 补齐,超过六位按四舍五入截断)。double a = 1;printf("%lf\\n", a);输出会是:1.000000

比如计算平均分,一到两位小数就足够了。可是有时六位又不够,需要更多位小数,比如计算高精度平方根。这时可以用printf的格式控制。如果要输出n位小数,那么可以用%.nlf的格式。其中n为数字。

所在函数库为【ctype.h】 

int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0

int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或数字('0'-'9')

返回非0值,否则返回0

int isascii(int ch) 若ch是字符(ASCII码中的0-127)返回非0值,否则返回0

int iscntrl(int ch) 若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F)

以上内容参考:百度百科-C语言函数

参考技术A double占8个字节(64位)内存空间,最多可提供16位有效数字,小数点后默认保留6位。如全是整数,最多提供15位有效数字。测试代码如下,

#include <stdio.h>
#include <math.h>
int main(int argc, char *argv[])

printf("%lf\n",123456789012345678.789);//输出123456789012345680.000000
printf("%lf\n",(double)123456789012345678);//输出123456789012345680.000000
printf("%lf\n",1234567890.1234567);//输出1234567890.123457
return 0;


对于double类型数据,通常不能与0直接比较,而是通过其绝对值小于给定的容差值来判断是否满足精度需求,"float.h"头文件往往定义了基本数据类型能够表示的数据的最大值和最小值,比如,
#define DBL_MIN 2.2250738585072014e-308 //宏定义了double类型最小正数
参考技术B C语言中double代表的意思是:

double是C语言的一个关键字,代表双精度浮点型,占8个字节内存空间,其数值范围为“1.7E-308~1.7E+308”,双精度完全保证的有效数字是15位,16位只是部分数值有保证。

double 和 float 区别

C语言中,float和double都属于浮点数。区别在于:double所表示的范围,整数部分范围大于float,小数部分,精度也高于float。

举个例子:圆周率3.1415926535 这个数字,如果用float来表示,最多只能精确到小数点后面的6位。而double大约能精确到小数点后面的15位左右。具体精确到几位,跟所用的编译器有关,但是各个编辑器编译器之间,也是相差不大的。

至于整数部分,float表示的整数部分的范围,就已经够大了,能表示到万亿级别,已经大到没边了。而double所表示的整数范围,大到更没边了。实际开发中,除了个别高精领域,基本上,使用float就足够了。

double是C语言的一个关键字,bai代表双du精度浮点型。

占8 个字节(64位)内存空间zhi。其数dao值范围为1.7E-308~1.7E+308,双精度完全保证的有效数字是15位,16位只是部分数值有保证。

可以用格式化输入输出语句scanf和printf进行double类型的输入输出,格式化字符为%lf。

赋值中的类型转换

当赋值运算符两边的运算对象类型不同时,将要发生类型转换, 转换的规则是:把赋值运算符右侧表达式的类型转换为左侧变量的类型。具体的转换如下:

1、浮点型与整型

单双精度)转换为整数时,将舍弃浮点数的小数部分, 只保留整数部分。将整型值赋给浮点型变量,数值不变,只将形式改为浮点形式, 即小数点后带若干个0。注意:赋值时的类型转换实际上是强制的。

2、单、双精度浮点型

由于C语言中的浮点值总是用双精度表示的,所以float 型数据只是在尾部加0延长为double型数据参加运算,然后直接赋值。double型数据转换为float型时,通过截尾数来实现,截断前要进行四舍五入操作。

3、 char型与int型

int型数值赋给char型变量时,只保留其最低8位,高位部分舍弃。

char型数值赋给int型变量时, 一些编译程序不管其值大小都作正数处理,而另一些编译程序在转换时,若char型数据值大于127,就作为负数处理。

对于使用者来讲,如果原来char型数据取正值,转换后仍为正值;如果原来char型值可正可负,则转换后也仍然保持原值, 只是数据的内部表示形式有所不同。
参考技术C 双精度实数。
占用字节8
有效数字15~16(因为二进制转十进制问题)
数值范围-1.7*10负308次方~1.7*10的308次方。

当有效数字全部是整数时,即整数有15~16位。
ps:严重同意tanyuguo的:“只考虑有效位数,不考虑整数部分有多少位”。

具体内存中的表示方法参考:http://zhidao.baidu.com/question/15397287.html本回答被提问者采纳
参考技术D 32位下:
double占用字节8,数值范围-1.7*10^-308~1.7*10^308。

以上是关于C语言有效位的主要内容,如果未能解决你的问题,请参考以下文章

C语言中的double是最多多少位?

c语言中小数怎么表示

c语言中float啥意思 输入的可不可以是一位有效数字

c语言中啥是单精度型和双精度型???各举个例子。。。

c语言 输入一个变量n 让一个小数保留n位有效数字 如何实现

C语言里要对输出的结果用科学计数法表示保留三位有效数字应该怎么写啊?