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函数有两个参数,第一个参数是分子,第二个参数是分母,它返回第一个参数除以第二个参数的余数。

通过输出的结果可以看到,浮点数的精度没有丢失。
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注本网站的更多内容!
您可能感兴趣的文章:
- 解决Python中的modf()函数取小数部分不准确问题
- C语言实现字符串转浮点函数的示例
- Python字符串转换成浮点数函数分享
- PHP中round()函数对浮点数进行四舍五入的方法
- php的sprintf函数的用法 控制浮点数格式
- js判断输入是否为正整数、浮点数等数字的函数代码