浮点数显示(C51)
- 格式:doc
- 大小:48.50 KB
- 文档页数:9
C51常用数据类型C51是一种广泛应用于嵌入式系统开发的微控制器系列,其常用数据类型对于程序的开发和数据处理至关重要。
本文将详细介绍C51常用的数据类型及其特点。
1. 位数据类型(bit):位数据类型是C51中最基本的数据类型,它只能存储0或1两个值。
位数据类型在嵌入式系统中常用于对单个引脚的控制或状态的表示。
例如,可以使用位数据类型来表示一个开关的状态,或者控制一个LED灯的亮灭。
2. 无符号整数类型(unsigned int):无符号整数类型用于表示非负整数,其取值范围为0到65535。
无符号整数类型在C51中常用于计数器、计时器以及存储大量数据的数组等场景。
例如,可以使用无符号整数类型来记录一个传感器采集的数据,或者控制一个PWM信号的占空比。
3. 有符号整数类型(int):有符号整数类型用于表示正负整数,其取值范围为-32768到32767。
有符号整数类型在C51中常用于表示带符号的计数值或测量值。
例如,可以使用有符号整数类型来表示温度的正负值,或者记录一个计数器的增减情况。
4. 字符类型(char):字符类型用于表示一个字符,其取值范围为-128到127。
字符类型在C51中常用于存储和处理文本数据。
例如,可以使用字符类型来存储一个ASCII码对应的字符,或者进行字符串的拼接和比较操作。
5. 浮点数类型(float):浮点数类型用于表示带小数点的数值,其取值范围和精度较大。
浮点数类型在C51中常用于进行复杂的数值计算和数据处理。
例如,可以使用浮点数类型来进行传感器数据的精确计算,或者进行复杂的算法实现。
6. 枚举类型(enum):枚举类型用于定义一组具有相同属性的常量,其取值范围为枚举中定义的常量值。
枚举类型在C51中常用于表示状态、模式或选项等。
例如,可以使用枚举类型来定义一个开关的状态(开/关)、一个模式的选择(自动/手动)或一个选项的设置(低/中/高)。
7. 数组类型(array):数组类型用于存储一组具有相同数据类型的元素,其大小在定义时确定。
C51常用数据类型引言:C51是一种广泛应用于嵌入式系统开发的微控制器,其数据类型对于程序的正确性和效率至关重要。
本文将介绍C51常用的数据类型,包括整型、浮点型、字符型、数组和结构体,并探讨它们的特点和适用场景。
正文内容:1. 整型数据类型1.1 无符号整型(unsigned int):用于表示非负整数,范围为0到2^16-1。
1.2 有符号整型(signed int):用于表示正负整数,范围为-2^15到2^15-1。
1.3 短整型(short int):用于表示较小范围的整数,范围为-2^7到2^7-1。
1.4 长整型(long int):用于表示较大范围的整数,范围为-2^31到2^31-1。
1.5 位域(bit):用于表示单个位的数据,可用于节省内存空间。
2. 浮点型数据类型2.1 单精度浮点数(float):用于表示小数,范围为3.4E-38到3.4E+38,精度为6位小数。
2.2 双精度浮点数(double):用于表示更大范围和更高精度的小数,范围为1.7E-308到1.7E+308,精度为15位小数。
3. 字符型数据类型3.1 字符(char):用于表示单个字符,范围为-128到127,可用于表示ASCII 码。
3.2 字符串(string):用于表示一串字符,以'\0'结尾,可用于存储文本数据。
4. 数组4.1 一维数组:用于存储一组具有相同数据类型的元素,可通过索引访问各个元素。
4.2 二维数组:用于存储表格数据,具有行和列的结构,可通过行列索引访问各个元素。
4.3 多维数组:用于存储更复杂的数据结构,可通过多个索引访问各个元素。
5. 结构体5.1 结构体(struct):用于自定义数据类型,可将不同类型的数据组合成一个整体。
5.2 结构体成员:用于定义结构体内部的各个数据成员,可以是各种数据类型。
5.3 结构体数组:用于存储多个结构体对象,可通过索引访问各个对象。
C51常用数据类型C51是一种广泛应用于嵌入式系统开辟的微控制器系列。
在C51编程中,常用的数据类型对于正确的程序设计和内存管理至关重要。
本文将介绍C51常用的数据类型及其特性。
1. 位数据类型(bit):位数据类型是最基本的数据类型之一,用于表示一个二进制位。
位数据类型只能存储0或者1两个值,通常用于对单个开关、状态或者标志进行操作。
位数据类型在C51中使用关键字“bit”来声明。
例子:bit flag; //声明一个位类型的变量flag2. 无符号整数数据类型(unsigned int):无符号整数数据类型用于表示非负整数值。
在C51中,无符号整数数据类型使用关键字“unsigned int”或者“unsigned”来声明。
无符号整数类型的取值范围为0到65535。
例子:unsigned int counter; //声明一个无符号整数类型的变量counter3. 有符号整数数据类型(int):有符号整数数据类型用于表示正数、负数和零。
在C51中,有符号整数数据类型使用关键字“int”来声明。
有符号整数类型的取值范围为-32768到32767。
例子:int temperature; //声明一个有符号整数类型的变量temperature4. 字符数据类型(char):字符数据类型用于表示单个字符。
在C51中,字符数据类型使用关键字“char”来声明。
字符类型的取值范围为-128到127。
例子:char letter; //声明一个字符类型的变量letter5. 浮点数数据类型(float):浮点数数据类型用于表示带有小数部份的数值。
在C51中,浮点数数据类型使用关键字“float”来声明。
浮点数类型的取值范围和精度取决于具体的C51编译器。
例子:float pi = 3.14159; //声明一个浮点数类型的变量pi6. 枚举数据类型(enum):枚举数据类型用于定义一组具有离散取值的符号常量。
C51常用数据类型在C51单片机编程中,常用数据类型是编写程序时必不可少的基本元素。
了解和正确使用这些数据类型是编程的基础。
本文将详细介绍C51常用的数据类型及其使用方法。
1. 位数据类型(bit):位数据类型是最基本的数据类型之一,用于表示一个二进制位。
在C51中,位数据类型使用关键字bit进行声明。
位数据类型只能取0或者1的值。
例如:bit flag; //声明一个位变量flag2. 逻辑数据类型(bit):逻辑数据类型是C51中的另一种位数据类型,用于表示逻辑值。
逻辑数据类型可以取0或者1的值,分别表示假和真。
例如:bit isTrue = 1; //声明一个逻辑变量isTrue,并将其赋值为真3. 字符数据类型(char):字符数据类型用于表示一个字符,它是由ASCII码表中的字符集合组成的。
在C51中,字符数据类型使用关键字char进行声明。
例如:char ch = 'A'; //声明一个字符变量ch,并将其赋值为字符'A'4. 无符号整数数据类型(unsigned char、unsigned int、unsigned long):无符号整数数据类型用于表示正整数,不包含负数。
在C51中,无符号整数数据类型分为无符号字符(unsigned char)、无符号整数(unsigned int)和无符号长整数(unsigned long)。
例如:unsigned char num1 = 255; //声明一个无符号字符变量num1,并将其赋值为255unsigned int num2 = 65535; //声明一个无符号整数变量num2,并将其赋值为65535unsigned long num3 = 4294967295; //声明一个无符号长整数变量num3,并将其赋值为42949672955. 有符号整数数据类型(signed char、signed int、signed long):有符号整数数据类型用于表示正整数和负整数。
C51数据类型引言概述:C51是一种广泛应用于嵌入式系统开辟的单片机编程语言,其中数据类型是程序设计中非常重要的组成部份。
正确理解和使用C51数据类型可以匡助程序员更高效地开辟嵌入式系统。
本文将详细介绍C51数据类型的相关知识。
一、基本数据类型1.1 位(bit):C51中最小的数据单位是位,用于表示二进制数据。
1.2 字节(byte):一个字节由8位组成,是C51中最基本的数据类型。
1.3 整型(int):C51中整型数据类型可以表示整数值,包括有符号和无符号整型。
二、浮点数据类型2.1 单精度浮点数(float):C51支持单精度浮点数,用于表示小数值。
2.2 双精度浮点数(double):C51也支持双精度浮点数,提供更高的精度。
2.3 浮点数据类型在嵌入式系统中通常用于处理需要高精度计算的场景。
三、数组数据类型3.1 一维数组:C51支持一维数组,可以存储相同类型的多个数据。
3.2 多维数组:除了一维数组,C51还支持多维数组,可以存储更复杂的数据结构。
3.3 数组数据类型在嵌入式系统中常用于存储传感器数据、采样数据等。
四、结构体数据类型4.1 结构体:C51支持结构体数据类型,可以将不同类型的数据组合在一起。
4.2 结构体成员:结构体可以包含多个成员变量,每一个成员变量可以是不同的数据类型。
4.3 结构体数据类型在嵌入式系统中常用于定义复杂的数据结构、数据包等。
五、枚举数据类型5.1 枚举:C51支持枚举数据类型,用于定义一组有限的命名常量。
5.2 枚举值:枚举类型中的每一个值都有一个对应的整数值。
5.3 枚举数据类型在嵌入式系统中常用于定义状态、标志位等。
结论:正确理解和使用C51数据类型对于嵌入式系统开辟至关重要。
程序员应该熟悉各种数据类型的特点和用法,合理选择适合的数据类型,以提高程序的效率和可靠性。
希翼本文对读者有所匡助,谢谢阅读。
C51的数据类型C51是一种广泛应用于嵌入式系统开发的微控制器系列,其数据类型是指在C 语言中用来表示不同类型数据的关键字或关键词。
了解C51的数据类型对于编写高效、可靠的嵌入式代码至关重要。
本文将详细介绍C51的数据类型及其使用方法。
1. 基本数据类型C51的基本数据类型包括整型、字符型和浮点型。
1.1 整型C51提供了多种整型数据类型,包括有符号和无符号类型。
以下是C51中常用的整型数据类型:- bit:用于表示1位的数据,只能存储0或1。
- sbit:用于表示1位的有符号数据,可以存储-1、0或1。
- unsigned char:用于表示无符号的8位数据,取值范围为0~255。
- signed char:用于表示有符号的8位数据,取值范围为-128~127。
- unsigned int:用于表示无符号的16位数据,取值范围为0~65535。
- signed int:用于表示有符号的16位数据,取值范围为-32768~32767。
- unsigned long:用于表示无符号的32位数据,取值范围为0~4294967295。
- signed long:用于表示有符号的32位数据,取值范围为-2147483648~2147483647。
1.2 字符型C51中的字符型数据类型用于表示单个字符。
常用的字符型数据类型是char,占用一个字节。
字符型数据可以用于存储ASCII码或其他字符集中的字符。
1.3 浮点型C51中的浮点型数据类型用于表示带有小数部分的数值。
由于C51的硬件限制,浮点型数据类型的支持有限。
通常使用定点数来模拟浮点数的运算。
2. 枚举类型枚举类型是一种用户自定义的数据类型,用于定义一组相关的符号常量。
在C51中,枚举类型可以用于定义一组离散的取值范围。
以下是一个示例:```cenum Weekday {Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday};```在上述示例中,Weekday是一个枚举类型,包含了一周的七个取值。
C51的数据类型C51是一种广泛使用的单片机,它具有多种数据类型用于存储和处理不同类型的数据。
在本文中,我们将详细介绍C51的数据类型,包括整数、字符、浮点数和数组。
1. 整数类型C51支持多种整数类型,包括有符号和无符号整数。
以下是C51中常用的整数类型:- char:用于存储字符数据,占用一个字节。
范围为-128到127。
- unsigned char:用于存储无符号字符数据,占用一个字节。
范围为0到255。
- int:用于存储整数数据,占用两个字节。
范围为-32768到32767。
- unsigned int:用于存储无符号整数数据,占用两个字节。
范围为0到65535。
- long:用于存储长整数数据,占用四个字节。
范围为-2147483648到2147483647。
- unsigned long:用于存储无符号长整数数据,占用四个字节。
范围为0到4294967295。
2. 字符类型C51中的字符类型用于存储单个字符。
字符类型可以用单引号括起来,例如 'A'。
C51中的字符类型实际上是用整数类型表示的,因此可以进行整数类型的运算。
3. 浮点数类型C51中的浮点数类型用于存储带有小数部分的数值。
C51支持两种浮点数类型:float和double。
这两种类型的区别在于存储精度和占用空间的大小。
float类型占用四个字节,而double类型占用八个字节。
4. 数组类型C51中的数组类型用于存储多个相同类型的数据。
数组可以是一维的,也可以是多维的。
以下是C51中定义数组的一般语法:```数据类型数组名称[数组大小];```例如,定义一个包含5个整数的一维数组可以如下所示:```int numbers[5];```数组元素可以通过索引访问,索引从0开始。
例如,要访问数组numbers的第一个元素,可以使用numbers[0]。
总结:C51的数据类型包括整数、字符、浮点数和数组。
整数类型用于存储整数数据,字符类型用于存储单个字符,浮点数类型用于存储带有小数部分的数值,数组类型用于存储多个相同类型的数据。
IEEE-754标准的单精度浮点数1. 介绍IEEE 754是一种二进制表示浮点数的标准,它定义了浮点数的表示和运算规则。
这个标准最初是由IEEE (Institute of Electrical and Electronics Engineers)制定的,它定义了浮点数的表示方式、舍入规则、溢出和下溢、异常值处理等内容。
单精度浮点数是IEEE-754标准中的一种浮点数表示格式,它用32位表示一个浮点数,其中1位表示符号位,8位表示指数,23位表示尾数。
2. 单精度浮点数的表示单精度浮点数由三个部分组成:符号位、指数部分和尾数部分。
其中,第1位是符号位,表示数的正负;接下来的8位是指数部分,用来表示数的数量级;最后的23位是尾数部分,用来表示数的精度。
单精度浮点数采用以下方式表示一个数:S EEEEEEEE MMMMMMMMMMMMMMMMMMMMM其中,S为符号位,EEEEEEEEE为指数部分,MMMMMMMMMMMMMMMMMMMMMM为尾数部分。
3. 单精度浮点数的范围单精度浮点数可以表示的范围约为1.18e-38到3.4e38之间,它可以表示的精度约为7位有效数字。
这个范围和精度可以满足大部分科学计算和工程计算的需要。
4. 单精度浮点数的运算单精度浮点数的运算包括加减乘除、开方、求倒数等基本运算,以及求平方、求立方、取对数、取指数等高级运算。
在进行浮点数运算时,需要遵守IEEE 754标准中定义的舍入规则和溢出、下溢、异常值处理规则,以确保运算结果的正确性。
5. 单精度浮点数的应用单精度浮点数广泛应用于科学计算、工程计算、图形处理、物理模拟等领域。
在这些领域,对计算速度和内存占用有较高要求,因此使用单精度浮点数可以提高计算效率和节省内存空间。
6. 总结IEEE 754标准的单精度浮点数是一种用来表示浮点数的标准格式,它具有较高的表示范围和精度,广泛应用于科学计算和工程计算等领域。
在进行浮点数运算时,需要遵守IEEE 754标准中定义的规则,以确保运算结果的正确性。
C51的数据类型引言:C51是一种常用的单片机系列,它具有丰富的数据类型,这些数据类型在嵌入式系统中起着至关重要的作用。
本文将详细介绍C51的数据类型,包括整数类型、浮点数类型、字符类型和指针类型。
一、整数类型1.1 无符号整数类型:C51提供了多种无符号整数类型,如unsigned char、unsigned int和unsigned long等。
这些类型的取值范围分别是0到255、0到65535和0到4294967295,用于表示非负整数。
1.2 有符号整数类型:C51也提供了有符号整数类型,如signed char、signed int 和signed long等。
这些类型的取值范围分别是-128到127、-32768到32767和-2147483648到2147483647,用于表示正负整数。
1.3 位域类型:C51还支持位域类型,用于在一个字节中定义多个字段。
通过位域类型,可以有效地利用存储空间,提高程序的效率。
二、浮点数类型2.1 单精度浮点数类型:C51提供了float类型,用于表示单精度浮点数。
float类型占用4个字节,可以表示大约6到7位有效数字的浮点数。
2.2 双精度浮点数类型:C51还提供了double类型,用于表示双精度浮点数。
double类型占用8个字节,可以表示大约15到16位有效数字的浮点数。
三、字符类型3.1 字符类型:C51使用char类型来表示字符。
char类型占用1个字节,可以表示ASCII码字符或扩展字符。
3.2 字符串类型:C51中的字符串是由一系列字符组成的,以null字符'\0'结尾。
字符串常常用于存储文本信息,如显示在LCD屏幕上的文字。
四、指针类型4.1 指针类型:C51支持指针类型,用于存储变量的地址。
指针可以指向任何类型的数据,包括整数、浮点数、字符和结构体等。
4.2 空指针类型:C51还提供了空指针类型void*,用于表示一个不指向任何具体类型的指针。
浮点数显示C51里用4字节存储一个浮点数,格式遵循IEEE-754标准(详见c51.pdf第179页说明)。
一个浮点数用两个部分表示,尾数和2的幂,尾数代表浮点上的实际二进制数,2的幂代表指数,指数的保存形式是一个0到255的8位值,指数的实际值是保存值(0到255)减去127,一个范围在-127到+128之间的值,尾数是一个24位值(代表大约7个十进制数),最高位MSB通常是1,因此不保存。
一个符号位表示浮点数是正或负。
浮点数保存的字节格式如下:地址 +0 +1 +2 +3内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM这里S 代表符号位,1是负,0是正E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。
M 24位的尾数保存在23位中,只存储23位,最高位固定为1。
此方法用最较少的位数实现了较高的有效位数,提高了精度。
零是一个特定值,幂是0 尾数也是0。
浮点数-12.5作为一个十六进制数0xC1480000保存在存储区中,这个值如下:地址 +0 +1 +2 +3内容0xC1 0x48 0x00 0x00浮点数和十六进制等效保存值之间的转换相当简单。
下面的例子说明上面的值-12.5如何转换。
浮点保存值不是一个直接的格式,要转换为一个浮点数,位必须按上面的浮点数保存格式表所列的那样分开,例如:地址 +0 +1 +2 +3格式 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM二进制 11000001 01001000 00000000 00000000十六进制 C1 48 00 00从这个例子可以得到下面的信息:符号位是1 表示一个负数幂是二进制10000010或十进制130,130减去127是3,就是实际的幂。
尾数是后面的二进制数10010000000000000000000在尾数的左边有一个省略的小数点和1,这个1在浮点数的保存中经常省略,加上一个1和小数点到尾数的开头,得到尾数值如下:1.10010000000000000000000接着,根据指数调整尾数.一个负的指数向左移动小数点.一个正的指数向右移动小数点.因为指数是3,尾数调整如下:1100.10000000000000000000结果是一个二进制浮点数,小数点左边的二进制数代表所处位置的2的幂,例如:1100表示(1*2^3)+(1*2^2)+(0*2^1)+(0*2^0)=12。
小数点的右边也代表所处位置的2的幂,只是幂是负的。
例如:.100...表示(1*2^(-1))+(0*2^(-2))+(0*2^(-2))...=0.5。
这些值的和是12.5。
因为设置的符号位表示这数是负的,因此十六进制值0xC1480000表示-12.5。
浮点数错误信息8051没有包含捕获浮点数错误的中断向量,因此,你的软件必须正确响应这些错误情况。
除了正常的浮点数值,还包含二进制错误值。
这些值被定义为IEEE标准的一部分并用在正常浮点数操作过程中发生错误的时候。
你的代码应该在每一次浮点操作完成后检查可能出现的错误。
名称值含义NaN 0xFFFFFFF 不是一个数+INF 0x7F80000 正无穷(正溢出)-INF 0xFF80000 负无穷(负溢出)你可以使用如下的联合体(union)存储浮点数。
union f {float f; //浮点值unsigned long ul; //无符号长整数};这个union包含一个float和一个unsigned long以便执行浮点数学运算并响应IEEE错误状态。
以上是KEIL在线帮助的中译文,下面我们讨论如何显示浮点数。
尾数为24bit,最高可表达的整数值为2^24-1=16777215,也就是说,小于等于16777215的整数可以被精确显示。
这决定了十进制浮点数的有效位数为7位,10^7<16777215<10^8,10的7次方以内的数小于16777215,可以精确表示。
使用科学记数法时,整数部分占1位,所以小数部分最大占7-1=6位,即最大有6位十进制精度。
长整形数和浮点数都占4字节,但表示范围差别很大。
浮点数的范围为+-1.175494E-38到+-3.402823E+38,无符号长整形数范围为0到4294967295。
显示浮点数要用到长整形数保存数据,可他们范围差这么多,怎么办呢?仔细观察十进制浮点数的显示,有一个尾数和一个阶码,由上面论证可知32位IEEE-754浮点数最大有效数字为7位十进制数,超出此范围的数字有截断误差,不必理会,因此,浮点数尾数能够放在长整形数里保存。
阶码为-38到38,一个char型变量就可以保存。
综上所述,以10^7的最大跨度为窗口(小于10^7也可以,如:10,100...10000等,但决不能大于它,那样会超出精度范围),定位浮点数的量级,然后取出7位尾数的整数值存于长整形数里,再调整阶码,就可以精确显示此浮点数。
量级尺度如下:(-38)-(-35)-(-28)-(-21)-(-14)-(-7)-(0)-(7)-(14)-(21)-(28)-(35)-(38)请严格按照KEIL手册给出的浮点数范围显示,因为数值空间没有完全使用,有些值用于错误指示和表示正负无穷。
小于1.175494E-38的数仍可以显示一些,但最好不用,以免出错。
我采用直接判断的方法,剔除此种情况。
在计算机里结合律不成立,(a*b)*c!=a*(b*c),原则是先让计算结果值动态范围小的两个数运算,请注意程序里的写法。
注:(1E38/b)*1E6不要写成1E44/b,因为无法在32位浮点数里保存1E44,切记!计算机使用二进制数计算,能有效利用电子器件高速开关的特性,而人习惯于十进制数表示,二进制和十进制没有方便的转换方法,只能通过大量计算实现,浮点数的十进制科学记数法显示尤其需要大量的运算,可见,显示一个浮点数要经过若干次浮点运算,没有必要就不要显示,否则,花在显示上的时间比计算的耗时都要多得多。
源程序://===================================================================== =======================////===================================================================== =======================void DispF(float f) reentrant //用科学记数法显示浮点数,在float全范围内精确显示,超出范围给出提示。
{ //+-1.175494E-38到+-3.402823E+38float tf,b;unsigned long w,tw;char i,j;if(f<0){PrintChar(’-’);f=-1.0*f;}if(f<1.175494E-38){yyprintf("?.??????");//太小了,超出了最小范围。
return;}if(f>1E35){ //f>10^35tf=f/1E35;b=1000.0;for(i=0,j=38;i<4;i++,j--)if(tf/b<1) b=b/10.0;else break;w=f/(1E29*b); //1E35*b/1E6PrintW(w,j);}else if(f>1E28){ //10^28<f<=10^35tf=f/1E28;b=1E7;for(i=0,j=35;i<8;i++,j--)if(tf/b<1) b=b/10.0;else break;w=f/(1E22*b); //1E28*b/1E6PrintW(w,j);}else if(f>1E21){ //10^21<f<=10^28 tf=f/1E21;b=1E7;for(i=0,j=28;i<8;i++,j--)if(tf/b<1) b=b/10.0;else break;w=f/(1E15*b); //1E21*b/1E6PrintW(w,j);}else if(f>1E14){ //10^14<f<=10^21 tf=f/1E14;b=1E7;for(i=0,j=21;i<8;i++,j--)if(tf/b<1) b=b/10.0;else break;w=f/(1E8*b); //1E14*b/1E6PrintW(w,j);}else if(f>1E7){ //10^7<f<=10^14 tf=f/1E7;b=1E7;for(i=0,j=14;i<8;i++,j--)if(tf/b<1) b=b/10.0;else break;w=f/(10.0*b); //1E28*b/1E6PrintW(w,j);}else if(f>1){ //1<f<=10^7tf=f;b=1E7;for(i=0,j=7;i<8;i++,j--)if(tf/b<1) b=b/10.0;else break;w=f/(1E-6*b); //1E0*b/1E6PrintW(w,j);}else if(f>1E-7){ //10^-7<f<=1tf=f*1E7;b=1E7;for(i=0,j=0;i<8;i++,j--)if(tf/b<1) b=b/10.0;else break;w=f*(1E13/b); //(1E7/b)*1E6PrintW(w,j);}else if(f>1E-14){ //10^-14<f<=10^-7 tf=f*1E14;b=1E7;for(i=0,j=-7;i<8;i++,j--)if(tf/b<1) b=b/10.0;else break;w=f*(1E20/b); //(1E14/b)*1E6PrintW(w,j);}else if(f>1E-21){ //10^-21<f<=10^-14 tf=f*1E21;b=1E7;for(i=0,j=-14;i<8;i++,j--)if(tf/b<1) b=b/10.0;else break;w=f*(1E27/b); //(1E21/b)*1E6PrintW(w,j);}else if(f>1E-28){ //10^-28<f<=10^-21 tf=f*1E28;b=1E7;for(i=0,j=-21;i<8;i++,j--)if(tf/b<1) b=b/10.0;else break;w=f*(1E34/b); //(1E28/b)*1E6PrintW(w,j);}else if(f>1E-35){ //10^-35<f<=10^-28 tf=f*1E35;b=1E7;for(i=0,j=-28;i<8;i++,j--)if(tf/b<1) b=b/10.0;else break;w=f*(1E35/b)*1E6; //(1E35/b)*1E6 PrintW(w,j);}else{ //f<=10^-35tf=f*1E38;b=1000.0;for(i=0,j=-35;i<4;i++,j--)if(tf/b<1) b=b/10.0;else break;w=f*(1E38/b)*1E6; //(1E38/b)*1E6PrintW(w,j);}}void PrintW(unsigned long w,char j) reentrant //科学记数法,显示十进制尾数和阶码。