C语言学习笔记---浮点函数modf()和fmod()
modf函数可以提取出浮点数的整数部分和小数部分。fmod函数可以返回两个浮点数相除的余数。它们的函数原型如下:
double __cdecl modf(double _X,double *_Y);double __cdecl fmod(double _X,double _Y);
这两个函数的功能看起来都挺简单的,但是为什么在C语言库中还要专门搞一个函数来计算呢?在使用这两个函数之前,首先看一个简单的浮点数相关的例子。
int main ()
{int i;float j=1.0;for(i=0; i<100; i++){j+=0.1;printf("%f \n",j);}return(0);
}
给一个浮点数1.0
每次累加0.1
,总共累加100
,感觉就是一个简单的加法运算,它的输出结果肯定也知道是什么了,下面来运行一下这个代码,输出结果如下:
看到结果的第一眼,是不是感觉计算机算错了?怎么算着算着结果还给跑偏了。其实计算机并没有算错,程序运行的结果也是正确的。这里使用一个在线浮点数转换工具验证一下。
首先看一下浮点数1.0
在内存的存储情况。
再看一下浮点数2.8
在内存的存储情况。
通过对比可以看出1.0
的实际存储值是1
,和真实值是一样的。2.8
的实际存储值是2.7999999523162841796875
,和真实值已经产生了一点误差。那么这个误差是什么引起的呢?这里就要从浮点数的存储原理说起了。
通在C语言中,一个浮点数占32
位,其中第一位表示符号位,0
表示正数,1
表示负数。紧接着8
位表示指数部分,也就是系统会将浮点数表示为指数计数法,这8
位就是指数部分的值,但是这里的指数是以2
为底的。剩下的23
位表示的就是尾数,也就是有效数据。
由于小数部分都是通过 2^a+2^b+2^c.......2^n
这种指数的累加来实现的,而指数的累加不一定可以百分百的等于原值,它只可能无限的接近原值。所以对于浮点数的操作不是像整数那样简单,为了保证操作浮点数时的精度,所以C语言的库函数才给我们提供了这两种浮点数操作的函数,方便使用。
接下来看一下modf函数的用法。
#include <stdio.h>
#include <math.h>int main ()
{double x, fractpart, intpart;x = 8.123456;fractpart = modf(x, &intpart);printf("整数部分= %lf\n", intpart);printf("小数部分 = %lf \n", fractpart);return(0);
}
modf函数有两个参数,第一个参数时待操作的浮点数,第二个参数用来存储浮点数的整数部分,它的返回值是浮点数的小数部分。
通过输出结果可以看到,浮点数的整数部分和小数部分精度都没有丢失。
再看一下fmod函数的用法。
#include <stdio.h>
#include <math.h>int main ()
{float a, b;int c;a = 9.0;b = 3.7;c = 2;printf("%f / %f 的余数是 %lf\n", a, b, fmod(a,b));printf("%f / %d 的余数是 %lf\n", a, c, fmod(a,c));return(0);
}
fmod函数有两个参数,第一个参数是分子,第二个参数是分母,它返回第一个参数除以第二个参数的余数。
通过输出的结果可以看到,浮点数的精度没有丢失。
C语言学习笔记---浮点函数modf()和fmod()相关推荐
- C语言学习笔记-7.函数
一.函数的使用 1.每个函数在使用之前必须先定义 例:void function(); //有分号 int main() {-} void add() {-} //无分号 2. ...
- C语言学习笔记---abs()函数和div()函数
C语言库中提供了许多函数,这样需要计算的时候,可以直接借助库函数,而不用自己重新编写函数.今天就来看一下C语言标准库函数里面的整型函数. int __cdecl abs(int _X);long ...
- C语言学习笔记---断言函数assert()
在C语言库函数中提供了一个辅助调试程序的小型库,它是由assert()宏组成,接收一个整形表达式作为参数.如果表达式的值为假(非零),则assert()宏就在标准错误流(stderr)中写入一条错 ...
- C语言学习笔记---指向函数的指针
在内存中函数的存放也是一段连续的内存,函数名就是指向改内存中的首地址,所以也可以将这个函数的首地址赋给一个指针变量,这样通过指针变量就可以访问改函数. 那么为什么要通过指针来访问函数呢?下面通 ...
- C语言学习笔记---打印函数printf()和sprintf()函数
printf()函数 在C语言中使用最多的打印函数就是printf(),它可以将各种类型的数据转换为字符串输出. int main(int argc, char *argv[]) {char na ...
- C语言学习笔记——调用函数时提示警告
[代码] int main() { abc(); abc3(); return 0; } void abc() { int a=65135; double i=8256.67; a=(int)i+a; ...
- C语言学习笔记---时间函数strftime()
strftime函数主要用于时间格式化,它的函数原型如下: size_t __cdecl strftime(char * __restrict__ _Buf,size_t _SizeInBytes,c ...
- C语言学习笔记---时间函数ctime()和gmtime()
函数原型如下: __CRT_INLINE char *__cdecl ctime(const time_t *_Time);__CRT_INLINE struct tm *__cdecl gmti ...
- C语言学习笔记---时间函数asctime()和localtime()
这两个时间函数原型如下: char *__cdecl asctime(const struct tm *_Tm);__CRT_INLINE struct tm *__cdecl localtime ...
最新文章
- sqlplus 如何连接到指定数据库,并创建用户与授权
- (0062)iOS开发之Xcode自带单元测试UnitTest
- Django使用心得(四)
- [bzoj1614]: [Usaco2007 Jan]Telephone Lines架设电话线
- Linux应用程序设计之网络基础编程
- Tomcat端口被占用怎么查看占用程序
- ffmpeg mac 批量脚本_使用批处理脚本(BAT)调用FFMPEG批量编码视频
- BasKet Note Pads-利用软件作条记
- 晶振两端的谐振电容有特殊要求吗_干货 | 晶振电路设计诀窍
- JS修改标签中的文本且不影响其中标签
- 远程办公绝非远程监控,该如何挖掘远程办公的红利?
- HDP Hive StorageHandler 下推优化的坑
- VS2010安装部署成.NET 2.0过程的几个问题
- 关于解压软件和压缩软件
- 矩阵按层级内容排序——Power BI
- 论文翻译:Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector
- 中芯国际任命高永岗为董事长 周子学辞任执行董事职务
- 水星无线路由器设置虚拟服务器,水星路由器无线中继设置步骤
- 十年后的我们会是什么样的呢,二十年后的我国 会是什么样呢
- Label-Consistent Backdoor Attacks