Bootstrap

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

目录

一、头文件

二、函数简介

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 语言标准库中,<math.h> 头文件提供了用于浮点数取整和取余操作的函数,包括 ceil()floor()fmod() 和 modf()

一、头文件

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

#include <math.h>

二、函数简介

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:  
        result = result - 1  
        x = x + y  
    return x * sign(x)  # Assuming sign(x) returns 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()直接计算余数而不是通过循环。

四、注意事项

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

五、示例代码

#include <stdio.h>  
#include <math.h>  
  
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;  
}

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

;