在计算机中,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函数提取出浮点数的整数部分和小数部分。
fmod函数返回两个浮点数相除的余数。
double __cdecl modf(double _X,double *_Y);
double __cdecl fmod(double _X,double _Y);
#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函数有两个参数,第一个参数时待操作的浮点数,第二个参数用来存储浮点数的整数部分,它的返回值是浮点数的小数部分。
#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函数有两个参数,第一个参数是分子,第二个参数是分母,它返回第一个参数除以第二个参数的余数
求浮点数的最大公约数
double GCD(double x, double y)
{
if (0 == y)
return x;
else
return GCD(y, fmod(x, y));
}