> 技术文档 > 【C语言标准库函数】取整与取余函数:ceil(), floor(), fmod(), 和 modf()_fmod函数

【C语言标准库函数】取整与取余函数:ceil(), floor(), fmod(), 和 modf()_fmod函数

目录

一、头文件

二、函数简介

2.1. ceil(double x)

2.2. floor(double x)

2.3. fmod(double x, double y)

2.4. modf(double value, double *iptr)

三、伪代码实现(概念性)

四、注意事项

五、示例代码


在 C 语言标准库中, 头文件提供了用于浮点数取整和取余操作的函数,包括 ceil()floor()fmod() 和 modf()

一、头文件

这些函数都定义在头文件中,因此在使用之前需要包含这个头文件:

#include 

二、函数简介

2.1. ceil(double x)

功能ceil函数用于计算不小于给定数x的最小整数,即执行向上取整操作。

参数double x,要取整的浮点数。

返回值:返回类型为double,表示不小于x的最小整数。

注意点

  • x为正数时,结果是大于或等于x的最小整数。
  • x负数时,结果是小于或等于x的最大整数(即向0方向取整,但由于是负数,结果仍然是“向上”的)。
  • 对于x为非整数的情况,结果总是比x大或相等(如果x已经是整数,则结果就是x本身)。

2.2. floor(double x)

功能floor函数用于计算不大于给定数x的最大整数,即执行向下取整操作。

参数double x,要取整的浮点数。

返回值:返回类型为double,表示不大于x的最大整数。

注意点

  • x为正数时,结果是小于或等于x的最大整数。
  • x为负数时,由于数学上的“下方”对应于整数轴上更小的数(即更大的负数),因此结果是大于或等于x的最小整数(这与直觉上的“向下”相反,但在数学上是准确的描述)。
  • 对于x为非整数的情况,结果总是比x小或相等(如果x已经是整数,则结果就是x本身)。

2.3. fmod(double x, double y)

功能fmod函数用于计算两个数相除的余数,其结果的符号与被除数x相同。

参数

  • double x,被除数。
  • double y,除数。

返回值:返回类型为double,表示x除以y的余数。

注意点

  • 与整数除法中的取余操作不同,fmod的结果可能与除数y的符号不同,但一定与被除数x的符号相同。
  • 如果y为0,则结果是未定义的。
  • fmod函数通常用于浮点数运算,以获取除法的精确余数。

2.4. modf(double value, double *iptr)

功能modf函数用于将浮点数value分解为整数部分和小数部分。

参数

  • double value,要分解的浮点数。
  • double *iptr,指向一个double变量的指针,用于存储整数部分。

返回值:返回类型为double,表示value的小数部分。

注意点

  • 通过iptr指针参数,modf函数将value的整数部分返回给调用者。
  • 返回的值是value的小数部分,其符号与value相同。
  • 如果value本身就是整数,小数部分将是0.0。
  • 该函数不会修改value本身,而是将结果通过返回值和指针参数返回。

三、伪代码实现(概念性)

由于这些函数的实际实现依赖于底层库和编译器,以下给出的是概念性的伪代码:

function ceil(x): if x is integer: return x elif x > 0: return smallest integer greater than x else: return largest integer less than or equal to x function floor(x): if x is integer: return x elif x > 0: return largest integer less than or equal to x else: return smallest integer greater than x function fmod(x, y): result = 0 while x >= y: x = x - y result = result + 1 if x = 0, -1 if x < 0 function modf(value, iptr): iptr = truncate(value) # truncate to integer part return value - iptr # return fractional part

 注意:上述fmod()的伪代码实现仅用于说明目的,并不准确,因为fmod()直接计算余数而不是通过循环。

四、注意事项

  • 在使用这些函数时,需要包含头文件。
  • 这些函数处理的是浮点数,因此结果也是浮点数(除了modf()的整数部分通过指针返回)。
  • 对于ceil()floor(),负数取整的结果可能与直觉不同,特别是floor()对负数的处理。
  • fmod()的结果符号与被除数相同,这与某些语言或环境中的整数取余操作不同。
  • modf()同时返回整数部分和小数部分,但整数部分是通过指针参数返回的。

五、示例代码

#include  #include  int main() { double x = 3.14; double y = 2.0; double ipart; printf(\"ceil(%f) = %f\\n\", x, ceil(x)); printf(\"floor(%f) = %f\\n\", x, floor(x)); printf(\"fmod(%f, %f) = %f\\n\", x, y, fmod(x, y)); modf(x, &ipart); printf(\"modf(%f) = integer part: %f, fractional part: %f\\n\", x, ipart, x - ipart); return 0; }

 输出展示了这些函数如何工作,并验证它们的正确性。