首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【安全函数】ceil_s、floor_s、fmod_s 和 modf_s 详解

【安全函数】ceil_s、floor_s、fmod_s 和 modf_s 详解

作者头像
byte轻骑兵
发布2026-01-22 09:03:05
发布2026-01-22 09:03:05
1030
举报

在C语言开发领域,取整与取余操作是基础且高频的运算场景,广泛应用于数值计算、数据处理、嵌入式开发等多个领域。标准库中的ceil()floor()fmod()modf()函数虽能满足基本需求,但在安全性要求较高的场景(如金融计算、工业控制、航空航天等)中,其缺乏参数校验、错误处理机制不完善等问题逐渐凸显,可能导致程序崩溃、数据异常甚至安全漏洞。 为解决上述问题,安全增强版函数ceil_s()floor_s()fmod_s()modf_s()应运而生。

一、函数简介

安全取整与取余函数在标准函数的基础上,增加了参数合法性校验、错误状态反馈等核心特性,确保函数在各种边界场景下均能稳定运行。

1.1 向上取整安全函数:ceil_s()

1. 函数简介

ceil_s()是标准库函数ceil()的安全增强版本,其核心功能为对输入的双精度浮点数进行向上取整(即返回大于或等于该浮点数的最小整数)。与标准函数相比,ceil_s()新增了对输入参数有效性的校验(如是否为合法浮点数、结果存储指针是否为空),并通过返回值明确告知函数执行状态(成功或具体错误类型),避免因非法参数导致的未定义行为。

2. 函数原型

代码语言:javascript
复制
#include <math.h>
#include <errno.h>

// 功能:对double类型数值进行向上取整,结果存入result
// 参数:x - 待取整的双精度浮点数;result - 存储取整结果的指针
// 返回值:0 - 执行成功;非0 - 执行失败(具体错误码见注意事项)
int ceil_s(double x, double *result);

3. 函数实现(伪代码)

该函数的实现核心在于“参数校验先行,核心运算后置”,确保只有合法的参数才能进入取整逻辑,具体伪代码如下:

代码语言:javascript
复制
int ceil_s(double x, double *result) {
    // 1. 校验结果存储指针是否为空(避免空指针解引用)
    if (result == NULL) {
        errno = EINVAL; // 设置错误码为"无效参数"
        return -1;      // 返回失败标识
    }
    
    // 2. 校验输入数值是否为合法浮点数(排除NaN、无穷大等异常值)
    if (isnan(x) || isinf(x)) {
        errno = EDOM;   // 设置错误码为"参数超出定义域"
        *result = 0.0;  // 初始化结果为默认值
        return -2;      // 返回失败标识
    }
    
    // 3. 执行核心向上取整逻辑(复用标准库的成熟实现)
    *result = ceil(x);
    
    // 4. 校验取整结果是否合法(应对极端值场景)
    if (isnan(*result) || isinf(*result)) {
        errno = ERANGE; // 设置错误码为"结果超出范围"
        return -3;      // 返回失败标识
    }
    
    // 5. 执行成功
    return 0;
}

函数首先校验结果指针的有效性,避免空指针解引用导致的程序崩溃;接着通过isnan()isinf()函数判断输入值是否为合法浮点数(排除非数值NaN、无穷大等异常情况);核心取整逻辑复用标准库ceil()函数以保证运算精度;最后校验结果的合法性,确保极端值场景下的稳定性。

4. 使用场景

  • 资源分配计算:在内存分配、设备调度等场景中,需根据需求向上取整确定资源数量。例如,某任务需处理1025字节数据,若每个数据块容量为100字节,则需分配11个数据块,此时可通过ceil_s(1025.0/100.0, &result)计算得出。
  • 金融金额计算:在金融领域,涉及手续费、利息等金额计算时,需向上取整以确保资金充足。例如,某理财产品的日利息为0.0032元,计算100天的利息时,需向上取整到分,避免金额不足。
  • 嵌入式系统时间计算:在嵌入式设备中,若需将毫秒级时间转换为秒级,且要求“不足1秒按1秒计算”,可通过ceil_s(time_ms / 1000.0, &result)实现。

5. 注意事项

  • 错误码含义:函数返回值非0时,可通过errno获取具体错误信息:EINVAL(结果指针为空)、EDOM(输入为NaN或无穷大)、ERANGE(结果超出浮点数表示范围)。
  • 整数输入处理:若输入为整数(如3.0),函数将返回其本身(3.0),符合向上取整的数学定义。
  • 负数值处理:对负数取整时,需注意向上取整的逻辑。例如,ceil_s(-2.3, &res)的结果为-2.0(大于-2.3的最小整数),而非-3.0。

1.2 向下取整安全函数:floor_s()

1. 函数简介

floor_s()floor()的安全增强版,用于对双精度浮点数进行向下取整,即返回小于或等于该浮点数的最大整数。其安全特性与ceil_s()一致,包含参数校验、错误反馈等机制,可有效避免标准函数在非法参数场景下的未定义行为。

2. 函数原型

代码语言:javascript
复制
#include <math.h>
#include <errno.h>

// 功能:对double类型数值进行向下取整,结果存入result
// 参数:x - 待取整的双精度浮点数;result - 存储取整结果的指针
// 返回值:0 - 执行成功;非0 - 执行失败(错误码含义同ceil_s())
int floor_s(double x, double *result);

3. 函数实现(伪代码)

ceil_s()的实现逻辑一致,floor_s()同样遵循“校验先行”的原则,核心差异仅在于取整逻辑的不同,具体伪代码如下:

代码语言:javascript
复制
int floor_s(double x, double *result) {
    // 1. 校验结果指针非空
    if (result == NULL) {
        errno = EINVAL;
        return -1;
    }
    
    // 2. 校验输入数值合法
    if (isnan(x) || isinf(x)) {
        errno = EDOM;
        *result = 0.0;
        return -2;
    }
    
    // 3. 执行核心向下取整逻辑
    *result = floor(x);
    
    // 4. 校验结果合法
    if (isnan(*result) || isinf(*result)) {
        errno = ERANGE;
        return -3;
    }
    
    // 5. 执行成功
    return 0;
}

4. 使用场景

  • 数据分段统计:在用户年龄、成绩等数据统计场景中,需将连续数值分段。例如,将0-100分的成绩按10分一段划分,计算某分数所属段数时,可通过floor_s(score / 10.0, &result)实现。
  • 文件分片传输:在大文件传输场景中,需将文件拆分为固定大小的分片。例如,将10240字节的文件按1024字节分片,可通过floor_s(10240.0/1024.0, &result)计算出分片数量为10。
  • 时间戳转换:将毫秒级时间戳转换为秒级时,需向下取整(忽略毫秒部分),如floor_s(timestamp_ms / 1000.0, &result)

5. 注意事项

  • 负数值处理:与向上取整不同,负数向下取整会得到更小的整数。例如,floor_s(-2.3, &res)的结果为-3.0,需注意与数学直觉的差异。
  • 结果精度问题:对于极大或极小的浮点数,需注意结果是否超出double类型的表示范围,此时函数会返回ERANGE错误码。

1.3 浮点数取余安全函数:fmod_s()

1. 函数简介

fmod_s()是标准函数fmod()的安全版,用于计算两个双精度浮点数的余数(即计算x除以y的余数,满足x = n*y + r,其中n为整数,且0 ≤ |r| < |y|)。其安全特性主要体现在:校验除数是否为0、参数是否为合法浮点数、结果指针是否为空,并通过返回值反馈执行状态。

2. 函数原型

代码语言:javascript
复制
#include <math.h>
#include <errno.h>

// 功能:计算x除以y的余数,结果存入result
// 参数:x - 被除数(双精度浮点数);y - 除数(双精度浮点数);result - 存储余数的指针
// 返回值:0 - 执行成功;非0 - 执行失败
int fmod_s(double x, double y, double *result);

3. 函数实现(伪代码)

该函数的核心风险点在于除数为0,因此实现时需重点校验除数的合法性,具体伪代码如下:

代码语言:javascript
复制
int fmod_s(double x, double y, double *result) {
    // 1. 校验结果指针非空
    if (result == NULL) {
        errno = EINVAL;
        return -1;
    }
    
    // 2. 校验输入数值合法(排除NaN、无穷大)
    if (isnan(x) || isinf(x) || isnan(y) || isinf(y)) {
        errno = EDOM;
        *result = 0.0;
        return -2;
    }
    
    // 3. 校验除数不为0(避免除零错误)
    if (fabs(y) < 1e-15) { // 考虑浮点数精度误差,判断绝对值是否接近0
        errno = EDOM;
        *result = 0.0;
        return -3;
    }
    
    // 4. 执行核心取余逻辑
    *result = fmod(x, y);
    
    // 5. 校验结果合法
    if (isnan(*result) || isinf(*result)) {
        errno = ERANGE;
        return -4;
    }
    
    // 6. 执行成功
    return 0;
}

函数在参数校验阶段,除了常规的指针和合法值校验外,还通过判断除数的绝对值是否小于极小值(1e-15)来处理浮点数精度误差导致的“伪零”问题,避免因微小数值被误判为0而引发的除零错误。

4. 使用场景

  • 周期性任务调度:在嵌入式系统中,需根据时间周期执行任务时,可通过fmod_s(current_time, period, &res)计算当前时间与周期的余数,判断是否到达任务执行时间。
  • 数据循环存储:当数据需存储在固定大小的数组中并循环覆盖时,可通过取余计算存储索引,如fmod_s(data_index, array_size, &res)
  • 数值合法性校验:例如,校验某数值是否为偶数时,可计算fmod_s(x, 2.0, &res),若余数为0则为偶数。

5. 注意事项

  • 除数校验细节:由于浮点数存在精度误差,不能直接判断除数是否等于0,需通过判断其绝对值是否小于极小值(如1e-15)来确定是否为“有效零”。
  • 正负号规则:余数的正负号与被除数一致。例如,fmod_s(-5.0, 2.0, &res)的结果为-1.0,fmod_s(5.0, -2.0, &res)的结果为1.0。
  • 极端值处理:当被除数远小于除数时,余数即为被除数本身;当被除数为0时,余数为0。

1.4 浮点数拆分安全函数:modf_s()

1. 函数简介

modf_s()modf()的安全增强版,用于将一个双精度浮点数拆分为整数部分和小数部分,且整数部分与原数具有相同的正负号。其安全特性体现在:校验输入参数和结果指针的合法性,反馈错误状态,避免因空指针或非法输入导致的程序异常。

2. 函数原型

代码语言:javascript
复制
#include <math.h>
#include <errno.h>

// 功能:将x拆分为整数部分和小数部分,分别存入int_part和frac_part
// 参数:x - 待拆分的双精度浮点数;int_part - 存储整数部分的指针;frac_part - 存储小数部分的指针
// 返回值:0 - 执行成功;非0 - 执行失败
int modf_s(double x, double *int_part, double *frac_part);

3. 函数实现(伪代码)

该函数需同时校验两个结果指针的合法性,核心实现逻辑如下:

代码语言:javascript
复制
int modf_s(double x, double *int_part, double *frac_part) {
    // 1. 校验两个结果指针均非空
    if (int_part == NULL || frac_part == NULL) {
        errno = EINVAL;
        return -1;
    }
    
    // 2. 校验输入数值合法(排除NaN、无穷大)
    if (isnan(x) || isinf(x)) {
        errno = EDOM;
        *int_part = 0.0;
        *frac_part = 0.0;
        return -2;
    }
    
    // 3. 执行核心拆分逻辑
    *frac_part = modf(x, int_part);
    
    // 4. 校验结果合法
    if (isnan(*int_part) || isinf(*int_part) || isnan(*frac_part) || isinf(*frac_part)) {
        errno = ERANGE;
        return -3;
    }
    
    // 5. 执行成功
    return 0;
}

函数首先校验两个结果指针是否为空,避免空指针解引用;接着校验输入值的合法性;核心拆分逻辑复用标准库modf()函数,确保拆分精度;最后校验拆分后的整数和小数部分是否合法,确保函数稳定性。

4. 使用场景

  • 数值格式化显示:在界面开发中,需将浮点数按“整数部分.小数部分”的格式显示时,可通过modf_s()拆分后分别处理,如将123.45拆分为123.0和0.45。
  • 高精度计算:在需要分别对整数和小数部分进行运算的场景(如金融计算中的本金和利息拆分),可通过该函数拆分后单独处理。
  • 数据校验:校验某浮点数是否为整数时,可拆分后判断小数部分是否为0.0。

5. 注意事项

  • 结果特性:小数部分的绝对值始终小于1.0,且与原数正负号一致;整数部分为双精度浮点数类型,如需转换为整数类型需额外处理。
  • 指针校验:必须确保int_partfrac_part均不为空,否则函数会返回EINVAL错误。
  • 极端值处理:对于极大的浮点数,拆分后的整数部分可能超出double类型的精度范围,此时函数会返回ERANGE错误。

二、安全函数与标准函数的核心差异

安全函数ceil_s()系列与标准函数ceil()系列的核心差异体现在安全性、错误处理、使用成本等多个维度。为清晰展示差异,以下将从6个关键维度进行对比分析:

对比维度

标准函数(ceil()等)

安全函数(ceil_s()等)

参数校验

无参数校验,直接执行运算。若输入为NaN、无穷大或结果指针为空,会导致未定义行为(如程序崩溃、数据异常)。

完善的参数校验:校验结果指针非空、输入值为合法浮点数、除数非零(仅fmod_s())等,从源头避免非法参数问题。

错误处理

无明确错误返回值,仅通过全局变量errno间接反馈部分错误,且错误类型不完整(如无法区分空指针与非法输入)。

通过返回值明确反馈执行状态(成功/失败),结合errno提供具体错误码,错误类型覆盖参数、定义域、范围等场景,便于问题定位。

返回值含义

返回运算结果(如ceil()返回向上取整后的数值),无执行状态反馈。

返回执行状态(0为成功,非0为失败),运算结果通过输出参数(指针)存储,逻辑更清晰。

未定义行为防范

无法防范未定义行为,在边界场景(如除零、空指针)下极易出现程序崩溃、数据错乱等问题。

通过参数校验和结果校验,完全避免未定义行为,在任何输入场景下均能稳定运行(返回错误状态而非崩溃)。

使用成本

使用简单,无需处理错误状态,直接调用即可获取结果,适合对安全性要求较低的场景。

使用成本略高,需在调用后判断返回值以处理错误,且需传入结果指针,但换来更高的安全性,适合高安全要求场景。

适用场景

原型开发、调试、非核心业务场景、对安全性要求较低的桌面应用等。

金融计算、工业控制、航空航天、嵌入式系统等对安全性、稳定性要求极高的核心业务场景。

标准函数胜在简洁易用,适合对安全性要求不高的场景;安全函数通过增加参数校验和错误处理,显著提升了稳定性和安全性,是高安全等级开发的首选。在实际开发中,需根据业务场景的安全性要求选择合适的函数。

三、实用示例代码演示

3.1 示例代码实现

代码语言:javascript
复制
#include <stdio.h>
#include <math.h>
#include <errno.h>
#include <string.h>

// 安全函数实现(伪代码转可编译逻辑)
int ceil_s(double x, double *result) {
    if (result == NULL) {
        errno = EINVAL;
        return -1;
    }
    if (isnan(x) || isinf(x)) {
        errno = EDOM;
        *result = 0.0;
        return -2;
    }
    *result = ceil(x);
    if (isnan(*result) || isinf(*result)) {
        errno = ERANGE;
        return -3;
    }
    return 0;
}

int floor_s(double x, double *result) {
    if (result == NULL) {
        errno = EINVAL;
        return -1;
    }
    if (isnan(x) || isinf(x)) {
        errno = EDOM;
        *result = 0.0;
        return -2;
    }
    *result = floor(x);
    if (isnan(*result) || isinf(*result)) {
        errno = ERANGE;
        return -3;
    }
    return 0;
}

int fmod_s(double x, double y, double *result) {
    if (result == NULL) {
        errno = EINVAL;
        return -1;
    }
    if (isnan(x) || isinf(x) || isnan(y) || isinf(y)) {
        errno = EDOM;
        *result = 0.0;
        return -2;
    }
    if (fabs(y) < 1e-15) {
        errno = EDOM;
        *result = 0.0;
        return -3;
    }
    *result = fmod(x, y);
    if (isnan(*result) || isinf(*result)) {
        errno = ERANGE;
        return -4;
    }
    return 0;
}

int modf_s(double x, double *int_part, double *frac_part) {
    if (int_part == NULL || frac_part == NULL) {
        errno = EINVAL;
        return -1;
    }
    if (isnan(x) || isinf(x)) {
        errno = EDOM;
        *int_part = 0.0;
        *frac_part = 0.0;
        return -2;
    }
    *frac_part = modf(x, int_part);
    if (isnan(*int_part) || isinf(*int_part) || isnan(*frac_part) || isinf(*frac_part)) {
        errno = ERANGE;
        return -3;
    }
    return 0;
}

// 错误信息解析函数
const char* get_error_msg(int ret) {
    switch (ret) {
        case -1: return "结果指针为空(EINVAL)";
        case -2: return "输入值非法(NaN/无穷大,EDOM)";
        case -3: return "结果超范围/除数为0(ERANGE/EDOM)";
        case -4: return "取余结果超范围(ERANGE)";
        default: return "未知错误";
    }
}

int main() {
    // 测试数据定义
    double test_x1 = 1025.0 / 100.0;  // 10.25(向上取整测试)
    double test_x2 = -2.3;             // 向下取整测试
    double test_x3 = 15.6, test_y3 = 2.0;  // 取余测试(正常)
    double test_x3_err = 15.6, test_y3_err = 0.0;  // 取余错误测试(除数0)
    double test_x4 = 123.456;          // 拆分测试
    double test_x4_err = NAN;          // 拆分错误测试(NaN输入)

    double result, int_part, frac_part;
    int ret;

    // 1. 测试ceil_s():向上取整
    printf("=== 测试ceil_s()向上取整 ===\n");
    ret = ceil_s(test_x1, &result);
    if (ret == 0) {
        printf("输入值:%.2f,向上取整结果:%.2f\n", test_x1, result);
    } else {
        printf("ceil_s()执行失败:%s\n", get_error_msg(ret));
    }

    // 2. 测试floor_s():向下取整
    printf("\n=== 测试floor_s()向下取整 ===\n");
    ret = floor_s(test_x2, &result);
    if (ret == 0) {
        printf("输入值:%.2f,向下取整结果:%.2f\n", test_x2, result);
    } else {
        printf("floor_s()执行失败:%s\n", get_error_msg(ret));
    }

    // 3. 测试fmod_s():正常取余与错误场景
    printf("\n=== 测试fmod_s()浮点数取余 ===\n");
    // 正常场景
    ret = fmod_s(test_x3, test_y3, &result);
    if (ret == 0) {
        printf("输入:%.1f / %.1f,余数结果:%.1f\n", test_x3, test_y3, result);
    } else {
        printf("fmod_s()正常场景失败:%s\n", get_error_msg(ret));
    }
    // 错误场景(除数为0)
    ret = fmod_s(test_x3_err, test_y3_err, &result);
    if (ret != 0) {
        printf("fmod_s()除数为0场景:%s(符合预期)\n", get_error_msg(ret));
    }

    // 4. 测试modf_s():正常拆分与错误场景
    printf("\n=== 测试modf_s()浮点数拆分 ===\n");
    // 正常场景
    ret = modf_s(test_x4, &int_part, &frac_part);
    if (ret == 0) {
        printf("输入值:%.3f,整数部分:%.0f,小数部分:%.3f\n", 
               test_x4, int_part, frac_part);
    } else {
        printf("modf_s()正常场景失败:%s\n", get_error_msg(ret));
    }
    // 错误场景(输入NaN)
    ret = modf_s(test_x4_err, &int_part, &frac_part);
    if (ret != 0) {
        printf("modf_s()输入NaN场景:%s(符合预期)\n", get_error_msg(ret));
    }

    return 0;
}

3.2 示例代码运行结果

代码语言:javascript
复制
=== 测试ceil_s()向上取整 ===
输入值:10.25,向上取整结果:11.00

=== 测试floor_s()向下取整 ===
输入值:-2.30,向下取整结果:-3.00

=== 测试fmod_s()浮点数取余 ===
输入:15.6 / 2.0,余数结果:1.6
fmod_s()除数为0场景:结果超范围/除数为0(ERANGE/EDOM)(符合预期)

=== 测试modf_s()浮点数拆分 ===
输入值:123.456,整数部分:123,小数部分:0.456
modf_s()输入NaN场景:输入值非法(NaN/无穷大,EDOM)(符合预期)

示例代码覆盖了4个安全函数的正常与错误场景,通过错误码解析函数清晰反馈问题原因。其中,fmod_s()的除数为0场景、modf_s()的NaN输入场景均被正确拦截,避免了程序崩溃,体现了安全函数的核心价值。

四、经典面试题

安全函数是C语言高安全等级开发的高频考点,以下3道面试题均来自大厂历年面试真题。

面试题1:基础差异类(华为2024年嵌入式开发面试题) 题目:简述C语言中ceil_s()与标准ceil()的核心差异,至少3点

答案:

  1. 参数校验机制ceil()无参数校验,若传入NaN/无穷大或结果指针为空会触发未定义行为;ceil_s()先校验指针非空、输入值合法,从源头规避风险。
  2. 错误反馈方式ceil()仅通过全局errno间接反馈部分错误,且类型模糊;ceil_s()通过返回值(0成功/非0失败)结合errno精准反馈错误类型(如EINVAL/EDOM)。
  3. 返回值逻辑ceil()返回运算结果,无执行状态标识;ceil_s()返回执行状态,结果通过输出指针存储,逻辑更清晰。
  4. 未定义行为防范ceil()在空指针、非法输入时可能崩溃;ceil_s()拦截所有非法场景,返回错误状态而非崩溃。

面试题2:逻辑实现类(腾讯2023年后台开发面试题) 题目:实现fmod_s()时,为何不能直接判断“除数==0.0”,而需用“fabs(y) < 1e-15”?请解释原理。

答案:

核心原因是浮点数精度误差,具体原理如下:

  1. 浮点数存储特性:C语言中double类型通过IEEE 754标准存储,部分十进制小数(如0.1)无法精确表示,会存在微小精度偏差。
  2. “伪零”问题:实际开发中,除数可能因多次运算(如减法、乘法)导致结果接近0但非严格0.0(如1e-16),直接判断“y==0.0”会误判为合法除数,引发除零错误。
  3. 极小值阈值逻辑:使用“fabs(y) < 1e-15”判断时,将绝对值小于1e-15的数值视为“有效零”,既覆盖了严格0.0,也拦截了因精度误差产生的“伪零”,避免除零未定义行为。

注意:阈值1e-15需结合场景调整,需平衡精度需求与误判风险。

面试题3:场景应用类(阿里2024年金融研发面试题) 题目:金融计算中需将1000.32元按“分”向上取整(1元=100分),用ceil_s()实现时需注意什么?写出核心代码。

答案:

需注意的核心点:

  1. 单位转换精度:避免直接将元转分(如1000.32*100),因浮点数精度偏差可能导致100032.0变成100031.99999999999,向上取整后出错。
  2. 错误处理强制:金融场景不允许未处理错误,必须判断ceil_s()返回值,避免因非法输入导致金额计算错误。

核心代码:

代码语言:javascript
复制
#include <math.h>
#include <errno.h>
#include <stdio.h>

// 金融场景:元转分并向上取整(确保不丢分)
int yuan_to_fen_ceil(double yuan, int *fen_result) {
    if (fen_result == NULL) {
        errno = EINVAL;
        return -1;
    }
    // 关键:先放大100倍后加极小值0.0001,抵消精度偏差
    double temp = yuan * 100.0 + 1e-4;
    double ceil_result;
    int ret = ceil_s(temp, &ceil_result);
    if (ret != 0) {
        printf("ceil_s()失败:%s\n", get_error_msg(ret));
        return ret;
    }
    // 转换为整数分(需确保结果在int范围内)
    *fen_result = (int)ceil_result;
    return 0;
}

// 调用示例
int main() {
    double amount = 1000.32;  // 1000.32元
    int fen;
    int ret = yuan_to_fen_ceil(amount, &fen);
    if (ret == 0) {
        printf("%.2f元 向上取整后为:%d分\n", amount, fen);  // 输出:100032分
    }
    return 0;
}

解析:通过加1e-4(远小于0.01分)修正精度偏差,确保1000.32*100的结果稳定为100032.0左右,向上取整后得到正确的分数值。

博主简介 byte轻骑兵,现就职于国内知名科技企业,专注于嵌入式系统研发,深耕 Android、Linux、RTOS、通信协议、AIoT、物联网及 C/C++ 等领域。乐于技术分享与交流,欢迎关注互动!

⚠️ 版权声明 本文为原创内容,未经授权禁止转载。商业合作或内容授权请联系邮箱并备注来意。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、函数简介
    • 1.1 向上取整安全函数:ceil_s()
    • 1.2 向下取整安全函数:floor_s()
    • 1.3 浮点数取余安全函数:fmod_s()
    • 1.4 浮点数拆分安全函数:modf_s()
  • 二、安全函数与标准函数的核心差异
  • 三、实用示例代码演示
    • 3.1 示例代码实现
    • 3.2 示例代码运行结果
  • 四、经典面试题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档