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()相关推荐

  1. C语言学习笔记-7.函数

    一.函数的使用 1.每个函数在使用之前必须先定义 例:void function();       //有分号 int main() {-} void add() {-}       //无分号 2. ...

  2. C语言学习笔记---abs()函数和div()函数

      C语言库中提供了许多函数,这样需要计算的时候,可以直接借助库函数,而不用自己重新编写函数.今天就来看一下C语言标准库函数里面的整型函数. int __cdecl abs(int _X);long ...

  3. C语言学习笔记---断言函数assert()

      在C语言库函数中提供了一个辅助调试程序的小型库,它是由assert()宏组成,接收一个整形表达式作为参数.如果表达式的值为假(非零),则assert()宏就在标准错误流(stderr)中写入一条错 ...

  4. C语言学习笔记---指向函数的指针

      在内存中函数的存放也是一段连续的内存,函数名就是指向改内存中的首地址,所以也可以将这个函数的首地址赋给一个指针变量,这样通过指针变量就可以访问改函数.   那么为什么要通过指针来访问函数呢?下面通 ...

  5. C语言学习笔记---打印函数printf()和sprintf()函数

    printf()函数   在C语言中使用最多的打印函数就是printf(),它可以将各种类型的数据转换为字符串输出. int main(int argc, char *argv[]) {char na ...

  6. C语言学习笔记——调用函数时提示警告

    [代码] int main() { abc(); abc3(); return 0; } void abc() { int a=65135; double i=8256.67; a=(int)i+a; ...

  7. C语言学习笔记---时间函数strftime()

    strftime函数主要用于时间格式化,它的函数原型如下: size_t __cdecl strftime(char * __restrict__ _Buf,size_t _SizeInBytes,c ...

  8. C语言学习笔记---时间函数ctime()和gmtime()

      函数原型如下: __CRT_INLINE char *__cdecl ctime(const time_t *_Time);__CRT_INLINE struct tm *__cdecl gmti ...

  9. C语言学习笔记---时间函数asctime()和localtime()

      这两个时间函数原型如下: char *__cdecl asctime(const struct tm *_Tm);__CRT_INLINE struct tm *__cdecl localtime ...

最新文章

  1. sqlplus 如何连接到指定数据库,并创建用户与授权
  2. (0062)iOS开发之Xcode自带单元测试UnitTest
  3. Django使用心得(四)
  4. [bzoj1614]: [Usaco2007 Jan]Telephone Lines架设电话线
  5. Linux应用程序设计之网络基础编程
  6. Tomcat端口被占用怎么查看占用程序
  7. ffmpeg mac 批量脚本_使用批处理脚本(BAT)调用FFMPEG批量编码视频
  8. BasKet Note Pads-利用软件作条记
  9. 晶振两端的谐振电容有特殊要求吗_干货 | 晶振电路设计诀窍
  10. JS修改标签中的文本且不影响其中标签
  11. 远程办公绝非远程监控,该如何挖掘远程办公的红利?
  12. HDP Hive StorageHandler 下推优化的坑
  13. VS2010安装部署成.NET 2.0过程的几个问题
  14. 关于解压软件和压缩软件
  15. 矩阵按层级内容排序——Power BI
  16. 论文翻译:Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector
  17. 中芯国际任命高永岗为董事长 周子学辞任执行董事职务
  18. 水星无线路由器设置虚拟服务器,水星路由器无线中继设置步骤
  19. 十年后的我们会是什么样的呢,二十年后的我国 会是什么样呢
  20. Label-Consistent Backdoor Attacks

热门文章

  1. zend studio一些常用配置
  2. Python体验(01)-变量、函数和基本控制语句
  3. 寻找必败态——一类博弈问题的快速解法
  4. jetbrains ide连接服务器上的docker
  5. N天学习一个linux命令之rsync
  6. 手把手教会你模拟退火算法
  7. kindeditor 下图片链接取消边框
  8. Struts2的声明式异常处理
  9. 根据屏幕大小制定显示页面
  10. 中文数字转换为阿拉伯数字