首先说一下:
范围是34E-38 ——34E+38,可提供7位有效数字。
上述这两个量都是近似值,各个编译器不太一样的。
下面我就将标准值是怎么定义的,和你说一下:
这个比较复杂,建议你找一下IEEE754标准看一下。
这个简单说一下吧:
在IEEE754标准中进行了单精度浮点数(float)和双精度数浮点数(double)的定义。float有32bit,double有64bit。它们的构成包括符号位、指数位和尾数位。
这些位的构成如下:
种类-------符号位-------------指数位----------------尾数位----
float---第31位(占1bit)---第30-23位(占8bit)----第22-0位(占23bit)
double--第63位(占1bit)---第62-52位(占11bit)---第51-0位(占52bit)
取值范围主要看指数部分:
float的指数部分有8bit(2^8),由于是有符号型,所以得到对应的指数范围-128~128。
double的指数部分有11bit(2^11),由于是有符号型,所以得到对应的指数范围-1024~1024。
由于float的指数部分对应的指数范围为-128~128,所以取值范围为:
-2^128到2^128,约等于-34E38 — +34E38
精度(有效数字)主要看尾数位:
float的尾数位是23bit,对应7~8位十进制数,所以有效数字有的编译器是7位,也有的是8位
->create database user;
->use user;
->create table user(id int(4) primary key auto_increment,user_number varchar(20),user_name varchar(20),date char(12),money char(8));
->insert into user values(id,'01','小李','2010-1-1','2000');
1、不知道你是用来做什么的,可以采用sprintf()格式化函数将数据格式为字符串,如要将Float a=11转换,则设定一个数组tmp(3)
length=sprintf(tmp,"%11f",a)
这里length会等于3,tmp={0x31,0x2e,0x31}
2、对于字符串向float转换,可先将数字都取出,记住取出小数后字符的个数n,取出的结果除以10^n
原理一般是将一个数先乘,再除,比如5232,可以先乘10,变成5232,运算之后再除100大概就是这个意思,我一般处理是先乘256,这样比较好处理,相当于左移八位,最后做四舍五入时判小数位的最高位就可以了,为1则入,否则就舍。
//
//功能: 把float 型的data 转换到字符串str_ptr 里, 小数保留d 位
// d=0, 去尾
//例如: data=123456 , 小数位数d=3 -> "12345"
//
//
#define STR_END '\0'
uchar Trans_Data_To_Disp(uchar str_ptr, float data, uchar d)
{
uint integral_part=0; //整数部分
float decimal_part=0; //小数部分
uint temp;
uchar i,n;
//整数部分
integral_part = (uint)(data);
temp=integral_part;
n=0;
do
{
n++;
temp=(uint)(temp/10); //得到整数部分位数n
}while(temp!=0);
temp=integral_part;
for( i=0; (i<n)&&(i<20); i++)
{
(str_ptr + n-1-i)=(uchar)(temp%10) +'0'; //从低位(str_ptr + n-1)开始,获取相应位
temp=(uint)(temp/10);
}
//补:原先是对应于lcd 202的显示的,所以有20个字符的限制,实际上float达不到这个精度
if( (d==0) || (i==20) )
{
(str_ptr + i) = STR_END; //此时 i = n 或20
return str_ptr;
}
else
{
(str_ptr + i) = ''; //此时 i = n ,且n < 20
}
//小数部分
decimal_part = data - integral_part;
for(i=n+1; (i<d+n+1)&&(i<20); i++)
{
decimal_part = decimal_part 10;
(str_ptr + i) = (uchar)(decimal_part) +'0'; //从高位(str_ptr + n+1)开始,获取相应位
decimal_part = decimal_part - (uchar)(decimal_part);
}
(str_ptr + i) = STR_END; //此时 i = d+n+1 或20
return str_ptr;
}
调用例子:
uchar tmp_buf[10] = {0};
Trans_Data_To_Disp(tmp_buf, float_vol, 2); //float_vol转为字符串保留2位小数,存在tmp_buf[]中
以上就是关于float的范围和有效数字怎么算出来的全部的内容,包括:float的范围和有效数字怎么算出来的、MYSQL5.1.51数据库无法创建设表、51单片机中我想把float类型转换为char[]数组。例如float a=1.1.转换为数组是char *b={49,47,49}等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)