float的范围和有效数字怎么算出来的

float的范围和有效数字怎么算出来的,第1张

首先说一下:

范围是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}等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9558041.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存