浮点数的概念

浮点数也称小数或实数。例如,0.0、75.0、4.023、0.27、-937.198 都是合法的小数。这是常见的小数的表现形式,称为十进制形式。

C语言中采用float和double关键字来定义小数,float称为单精度浮点型,double称为双精度浮点型,long double更长的双精度浮点型。

在任何区间内(如1.0 到 2.0 之间)都存在无穷多个实数,计算机的浮点数不能表示区间内所有的值。浮点数通常只是实际值的近似值,例如7.0可能被储存为浮点值6.99999。

点用内存的情况

我们先来测试一下float、double和long double三种浮点数据类型占用内存的字节数。

示例(book71.c)

运行结果

浮点数的精度

C标准规定,float类型必须至少能表示6位有效数字,且取值范围至少是10-37~10+37。

double类型和 float类型的最小取值范围相同,但至少必须能表示10位有效数字。

long double,以满足比double类型更高的精度要求。不过,C只保证long double类型至少与double类型的精度相同。

看了上面这段文字,估计大家有点晕,在之前的整数章节中,long比int的占用的内存多,存放数据的值也就越大,并且有一个准确的范围,但是,为什么各种浮点数存放数据的值怎么就这么模糊呢?我先不解释原因,浮点数的存储方式比较复杂,暂时不讨论,先用几个程序来测试一下它们的特征。

1、测试float类型

示例(book73.c)

运行结果

从程序的运行我们可以看出float数的两个特征:

float数据类型表达的是一个近似的数,不是准确的,小数点后的n位有误差,浮点数的位数越大,误差越大,到8位的时候,误差了1,基本上不能用了。

2)用“==”可以比较两个整数或字符是否相等,但是,看起来相等的两个浮点数,就是不会相等。

2、测试double类型

示例(book74.c)

运行结果

从程序的运行我们可以看出double数的两个特征:

1)double数据类型表达的也是一个近似的数,不是准确的,小数点后的n位有误差,浮点数的位数越大,误差越大,到17位的时候,误差了1,基本上不能用了。

2)用“==”可以比较两个double数值是否相等。

3、测试long double类型

示例(book75.c)

运行结果

long double的测试结果与double相同。

4、测试总结

float只能表达6-7位的有效数字,不能用“==”判断两个数字是否相等。

double能表达15-16位有效的数字,可以用“==”判断两个数字是否相等。

long double和double的特征相同。

在实际开发中,建议弃用float,只采用double就可以,long double暂时没有必要,但不知道以后的操作系统和编译器对long double是否有改进。

浮点数的输出

float采用%f输出,double采用%lf输出,测试结果证明,double也可以采用%f输出。

long double采用%Lf输出,注意,L是大写。

%lf缺省显示小数点后六位。

如果要显示小数点后n位,用%.nlf,例如:

double ff=7.5;

%.2lf显示 7.50

浮点数采用%lf输出,完整的输出格式是%m.nlf,指定输出数据整数部分和小数部分共占m位,其中有n位是小数。如果数值长度小于m,则左端补空格,若数值长度大于m,则按实际位数输出。

常用的库函数

在接下来的内容中,我只介绍double,不再介绍float和long double两种数据类型相关的知识。

以下是常用的浮点数函数,必须掌握。

double atof(const char *nptr);       //把字符串nptr转换为double

double fabs(double x);               //求双精度实数x的绝对值

double pow(double x, double y);     //求 x 的 y 次幂(次方)

double round(double x);              // double四舍五入

double ceil(double x);                 // double向上取整数

double floor(double x);               // double向下取整数

double fmod(double x,double y);     //求x/y整除后的双精度余数

double modf(double val,double *ip); //把双精度val分解成整数部分和小数部分,整数部分存放在ip所指的变量中,返回小数部分。

还有一些数据计算函数,如正弦、对数、指数等,实际开发中极少使用,大家要用的时候再查资料,我就不介绍了。

整数转换为浮点数

我们先来看一个示例(book77.c):

运行结果

需要特别注意的是dd=ii/jj这一行代码,dd的值0,不是0.75,有点意外,所以,如果对整数转换为浮点数没有把握,加(double)强制转换是个好办法。

应用技巧

浮点数有一些坑,例如两个浮点数不相等和精度的问题,在实际开发中,我们经常用整数代替浮点数,因为整数是精确的,效率也更高。

例如人的身高一米七五,以米为单位,用浮点数表示是1.75米,如果以厘米为单位,用整数表示是175。

long整数的取值是-9223372036854775808~9223372036854775807,有效数字是19位,而double的有效数字才15-16位,所以,整数可以表达的小数更大的数,更实用,麻烦也更少。

货币:1.75元,如果采用0.01元为单位就是175,采用0.001元为单位就是1750,如果你说要更多小数怎么办?你这是钻牛角尖。

给大家说一个道,高水平的程序员不容易掉坑里,注意,是不容易,不是一定不会,最好的方法是没有坑。

科学计数法

在实际开发中,我们很少使用科学计数法,但是它经常出现在计算机系统中,例如浮点数在内存中的存放方式就是科学计数法,所以我们还是有必要学习科学计数法。

科学记数法是一种记数的方法。把一个数表示成a与10的n次幂相乘的形式(1≤|a|<10,n为整数),这种记数法叫做科学记数法。当我们要书写或运算某个较大或较小且位数较多时,用科学记数法免去浪费很多空间和时间。

例如:51400000000=5.14×1011。计算器或电脑表达10的幂是一般是用E或e,也就是51400000000=5.14E11或5.14e11。

用科学记数法表示数时,不改变数的符号,只是改变数的书写形式而已,可以方便的表示日常生活中遇到的一些极大或极小的数 。如:光的速度大约是300,000,000米/秒;全世界人口数大约是:6,100,000,000。

这样的数,书写和显示都很不方便,我们可以免去写这么多重复的0,将其表现为这样的形式:6,100,000,000=6.1×109,即6.1E9或6.1e9。

或:0.00001=1×10-5,即绝对值小于1的数也可以用科学记数法表示为a乘10 的负n次方的形式。即1E-5或1e-5。

科学计数法采用%e或%E输出,完整的输出格式是%m.ne或%m.nE,指定输出数据整数部分和小数部分共占m位,其中有n位是小数。如果数值长度小于m,则左端补空格,若数值长度大于m,则按实际位数输出。

示例(book78.c):

运行结果

课后作业

编写示例程序,类似本章节的book71.c、book73.c、book74.c、book75.c、book77.c、book78.c,编译并运行它,记住,程序员是写出来的,不是看出来的,熟能生巧,你每天的付出都有意义。

2、编写示例程序,测试浮点数赋值超过取值范围的后果。

3、重写浮点数的常用库函数,实现其功能,函数的声明如下:

以下作业建议在学完《数据类型转换》后再做,因为有知识点交叉。

double FABS(const double x);            //求双精度实数x的绝对值

double ROUND(const double x);         // double四舍五入

double CEIL(const double x);             // double向上取整数

double FLOOR(const double x);          // double向下取整数

double MODF(double val,double *ip);    //把双精度val分解成整数部分和小数部分,整数部分存放在ip所指的变量中,返回小数部分。

学习交流

我建了一个QQ群701117364,有决心想学习的人可以加入,群中有学习资源,也欢迎高手加入。

c语言 准确赋值浮点数,C语言浮点数相关推荐

  1. c语言如何赋值字母,C语言赋值指代简介

    如果你刚刚步入计算机编码的世界,可能会发现这里是一个繁复而又绮丽的殿堂.无数的0和1在这里组成二进制的数字,无数的英文字母在这里组成程序的代码,就像那些科幻片中描绘的那样,科技感和未来感十足.虽然此时 ...

  2. 单片机c语言字符串赋值,单片机C语言中数组的用法

    数组是由具有相同类型的数据元素组成的有序集合.数组是由数组名来表示的,数组中的数据由特定的下标来唯一确定.引入数组的目的,是使用一块连续的内存空间存储多个类型相同的数据,以解决一批相关数据的存储问题. ...

  3. c语言 位赋值,【c语言】位段赋值的例子

    // 位段赋值的例子 #include int main() { unsigned char puc[4]; struct tagPIM { unsigned char ucPiml; unsigne ...

  4. C语言的本质(4)——浮点数的本质与运算

    C语言的本质(4)--浮点数的本质与运算 C语言规定了3种浮点数,float型.double型和long double型,其中float型占4个字节,double型占8个字节,longdouble型长 ...

  5. C语言 int 转单精度浮点,单精度浮点数与十六进制转换 C语言程序 单片机也可用...

    单精度浮点数与十六进制转换 C语言程序 单片机也可用 #include float Hex_To_Decimal(unsigned char *Byte,int num)//十六进制到浮点数 { // ...

  6. C语言存储为2进制,浮点数的二进制存储形式及c语言验证

    我们经常听说浮点数,其实浮点数是和定点数对应的.定点数就是小数点固定的数,而且他的小数点在最右边,所以定点数用来表示整数. 浮点数表示方法允许小数点的浮动,一个浮点数分为三个部分:第一部分是符号,可以 ...

  7. c语言保留小数点后n位_C语言(2)- 定点数和浮点数

    (本文为原创,版权归作者所有) 变量的基本类型里包含了整数和小数,它们是如何由一组0和1来表示的呢? 在数学的世界里,实数可以涵盖一个数轴上所有的点,它应该可以表示我们在日常生活中碰到的大部分的数.实 ...

  8. 双精度改单精度c语言程序,C语言菜鸟基础教程之单精度浮点数与双精度浮点数...

    上节课 简单介绍了浮点数.计算机程序中的浮点数分为单精度浮点数和双精度浮点数. 单精度和双精度精确的范围不一样. 计算机里的最基本的存储单位用位(bit)来表示.bit只能用来存储0或1. 稍大一点的 ...

  9. c语言浮点型菜鸟教程,C语言菜鸟基础教程之单精度浮点数与双精度浮点数

    上节课 简单介绍了浮点数.计算机程序中的浮点数分为单精度浮点数和双精度浮点数. 单精度和双精度精确的范围不一样. 计算机里的最基本的存储单位用位(bit)来表示.bit只能用来存储0或1. 稍大一点的 ...

最新文章

  1. [Offer收割]编程练习赛63
  2. php 缓存模块,PHP缓存之模块缓存(APC)_PHP教程
  3. 软件随想: 软件 = 程序 + 软件工程
  4. iOS 9应用开发教程之使用开关滑块控件以及滚动部署视图
  5. 操作系统级虚拟化概述
  6. 未来新一代计算机的发展方向,未来计算机的发展方向 (2)
  7. 【校招面试 之 C/C++】第17题 C 中的malloc相关
  8. eclipse的下载JDK的安装与配置
  9. zookeeper 屁民
  10. 苦等8个月!华为最令人期待的手机终于要来了:最快月底开卖
  11. 编程真可怕,我们日常都在写 Bug
  12. Facebook发布张量理解库,自动编译高性能机器学习核心
  13. alarm/pause
  14. MySQL-第十一篇JDBC典型用法
  15. 如何做一个基于JAVA的新闻管理系统毕业设计毕设作品(springboot框架)
  16. 【无标题】快宝电子面单接口
  17. 算法训练 调和数列问题
  18. Python基础 Zero to Hero面向对象编程(一)
  19. 鸿蒙系统与安卓系统有什么区别
  20. Python自动检查哪位学生未提交作业

热门文章

  1. webpy快速入门 搭建python服务器
  2. Java实现首字母大写
  3. CTS、CTS Verify、GTS测试以及GMS认证介绍
  4. 收藏随身查,光纤光缆60条必备知识!
  5. Rust图片类型识别
  6. 如何解决地图已加载却不能渲染的问题?
  7. BroadcastReceiver插件化
  8. 基于Go语言Echo+Layui的OA办公系统
  9. sparksql:dataframe数据写入到Hbase中
  10. 人工智能专业好就业吗?AI就业前景