【C++】ceil 和 floor 函数的实现与分析
文章目录
- 💯前言
- 💯ceil 和 floor 函数的基础介绍
- 1. ceil 函数
- 定义与功能
- 示例代码
- 输出结果
- 功能分析
- 使用场景
- 2. floor 函数
- 定义与功能
- 示例代码
- 输出结果
- 功能分析
- 使用场景
- 💯自行实现 ceil 和 floor 函数
- 1. 自行实现 ceil 函数
- 代码实现
- 示例输入输出
- 优化
- 2. 自行实现 floor 函数
- 代码实现
- 示例输入输出
- 💯`(int)` 类型转换的局限性
- 具体原因
- 示例
- 💯小结
💯前言
- 在日常的编程任务中,处理浮点数的向上取整和向下取整是一个非常常见的需求。C++ 提供了强大的数学库
<cmath>
,其中包含了ceil
和floor
函数,分别用于实现向上取整和向下取整的功能。然而,有些场景可能需要我们自行实现这些功能,以便深入理解其底层逻辑,或者针对某些特殊需求进行优化和扩展。
本文将通过代码实例详细分析ceil
和floor
的功能、实现思路及其扩展,包括自行实现的方式。同时,针对读者可能会遇到的问题,比如(int)
类型转换的局限性,我们也会进行详细说明,并提供相应的解决方案。
C++ 参考手册
💯ceil 和 floor 函数的基础介绍
1. ceil 函数
定义与功能
ceil
(向上取整)是一个数学函数,它的作用是将一个浮点数向上取整为大于等于它的最小整数。
示例代码
以下是使用标准库 ceil
函数的代码示例:
#include <iostream>
#include <cmath>
using namespace std;int main()
{cout << ceil(2.3) << endl; // 输出: 3cout << ceil(3.8) << endl; // 输出: 4cout << ceil(-2.3) << endl; // 输出: -2cout << ceil(-3.8) << endl; // 输出: -3return 0;
}
输出结果
3
4
-2
-3
功能分析
- 对正数:
ceil
会向上取整到最近的更大整数。例如,2.3
向上取整为3
,3.8
向上取整为4
。 - 对负数:
ceil
会向上取整到更接近零的整数。例如,-2.3
向上取整为-2
,-3.8
向上取整为-3
。
使用场景
ceil
常用于需要确保数值“至少达到某个值”的场景,比如:
- 计算物品的最少包装数量。
- 计算天数时,向上取整到完整的天数。
2. floor 函数
定义与功能
floor
(向下取整)是一个数学函数,它的作用是将一个浮点数向下取整为小于等于它的最大整数。
示例代码
以下是使用标准库 floor
函数的代码示例:
#include <iostream>
#include <cmath>
using namespace std;int main()
{cout << floor(2.3) << endl; // 输出: 2cout << floor(3.8) << endl; // 输出: 3cout << floor(-2.3) << endl; // 输出: -3cout << floor(-3.8) << endl; // 输出: -4return 0;
}
输出结果
2
3
-3
-4
功能分析
- 对正数:
floor
会向下取整到最近的更小整数。例如,2.3
向下取整为2
,3.8
向下取整为3
。 - 对负数:
floor
会向下取整到更远离零的整数。例如,-2.3
向下取整为-3
,-3.8
向下取整为-4
。
使用场景
floor
常用于需要确保数值“不超过某个值”的场景,比如:
- 分配预算,确保不超出限额。
- 对数据进行分组,向下取整到某个区间。
💯自行实现 ceil 和 floor 函数
1. 自行实现 ceil 函数
自行实现 ceil
的核心在于判断浮点数的小数部分是否大于 0。如果大于 0,则将整数部分加 1;否则直接返回整数部分。
代码实现
#include <iostream>
using namespace std;int main() {double d = 0; // 声明一个双精度浮点数并初始化为0cin >> d; // 输入一个浮点数int q = (int)d; // 提取浮点数的整数部分double p = d - q; // 计算浮点数的小数部分if (p > 0.0) // 如果小数部分大于 0cout << (int)(d + 1); // 输出向上取整后的整数elsecout << (int)d; // 否则直接输出整数部分return 0;
}
示例输入输出
-
输入:
3.14
- 整数部分:
3
- 小数部分:
0.14
- 输出:
4
- 整数部分:
-
输入:
5.00
- 整数部分:
5
- 小数部分:
0
- 输出:
5
- 整数部分:
-
输入:
-2.7
- 整数部分:
-2
- 小数部分:
-0.7
- 输出:
-2
- 整数部分:
优化
为了更清晰地表达逻辑,我们可以将代码封装为函数:
int myCeil(double d) {int q = (int)d;if (d - q > 0.0)return q + 1;return q;
}
2. 自行实现 floor 函数
自行实现 floor
的核心在于处理负数的特殊情况。如果是负数且存在小数部分,则需要向更小的整数方向取整。
代码实现
#include <iostream>
using namespace std;int main() {double d = 0;cin >> d;if (d >= 0) {cout << (int)d << endl; // 正数直接取整数部分} else {if (d == (int)d) {cout << (int)d << endl; // 如果是负整数,直接输出} else {cout << (int)(d - 1) << endl; // 负数向下取整}}return 0;
}
示例输入输出
- 输入:
3.14
- 输出:
3
- 输出:
- 输入:
-3.14
- 输出:
-4
- 输出:
💯(int)
类型转换的局限性
在讨论 ceil
和 floor
的实现时,(int)
强制类型转换是一个常见的手段,但它并不完全等同于 ceil
或 floor
,特别是在处理负数时。
具体原因
(int)
强制类型转换会直接截断小数部分(舍弃小数部分),相当于向零方向取整。- 对正数:效果等同于
floor
。 - 对负数:效果既不等同于
ceil
,也不等同于floor
。
示例
输入值 | (int) 转换 | ceil 结果 | floor 结果 |
---|---|---|---|
3.14 | 3 | 4 | 3 |
-3.14 | -3 | -3 | -4 |
💯小结
ceil
和floor
是 C++ 中处理浮点数取整的两个重要函数,其核心在于处理小数部分的舍入方式。(int)
强制转换可以用于简单的取整,但在负数场景下需要特别注意。- 自行实现
ceil
和floor
的过程能够帮助我们更好地理解这两个函数的逻辑,同时也能根据实际需求进行定制。
建议在实际开发中,优先使用标准库函数 ceil
和 floor
,它们经过高度优化并且能够处理更多边界情况。
相关文章:

【C++】ceil 和 floor 函数的实现与分析
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯ceil 和 floor 函数的基础介绍1. ceil 函数定义与功能示例代码输出结果功能分析使用场景 2. floor 函数定义与功能示例代码输出结果功能分析使用场景 💯自行实现…...

zabbix监控山石系列Hillstone配置模版(适用于zabbix6及以上)
监控项: 触发器: 监控数据:...

在瑞芯微RK3588平台上使用RKNN部署YOLOv8Pose模型的C++实战指南
在人工智能和计算机视觉领域,人体姿态估计是一项极具挑战性的任务,它对于理解人类行为、增强人机交互等方面具有重要意义。YOLOv8Pose作为YOLO系列中的新成员,以其高效和准确性在人体姿态估计任务中脱颖而出。本文将详细介绍如何在瑞芯微RK3588平台上,使用RKNN(Rockchip N…...

CTFHub disable_functions通关
LD_PRELOAD 来到首页发现有一句话直接就可以用蚁剑连接 根目录里有/flag但是不能看;命令也被ban了就需要绕过了 绕过工具在插件市场就可以下载 如果进不去的话 项目地址: #本地仓库;插件存放 antSword\antData\plugins 绕过选择 上传后我们点进去可以看到多了一个绕过的文件;…...

Chromium GN 目标指南 - view_example 计数器示例 (七)
1. 引言 在前面的文章中,我们学习了如何在 views_examples 中添加自定义 Button 示例。在本篇文章中,我们将继续探索 Views 框架的应用,创建一个简单的计数器示例,以学习如何使用 Label 和 Button 控件进行交互,以及如…...
一步一步写线程之十六线程的安全退出之二例程
一、说明 在一篇分析了多线程的安全退出的相关机制和方式,那么本篇就针对前一篇的相关的分析进行举例分析。因为有些方法实现的方法类似,可能就不一一重复列举了,相关的例程主要以在Linux上的运行为主。 二、实例 线程间的同步,…...

【Linux系列】Shell 脚本中的条件判断:`[ ]`与`[[ ]]`的比较
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

ArcGIS+MIKE21 洪水淹没分析、溃坝分析,洪水淹没动态效果
洪水淹没分析过程: 一、所需数据: 1.分析区域DEM数据 二、ArcGIS软件 1.提取分析区域DEM(水库坝下区域) 2.DEM栅格转点 3.计算转换后几何点的x和y坐标值(精度20、小数位3) 4.导出属性表,形式…...
Git 的基本概念和使用
Git是一个分布式版本控制系统,它可以帮助开发人员追踪和管理代码的修改。下面是Git的基本概念和使用方式的解释: 仓库(Repository):Git使用仓库来存储代码和版本历史记录。仓库可以位于本地计算机上,也可以…...
*【每日一题 基础题】 [蓝桥杯 2024 省 B] 好数
[蓝桥杯 2024 省 B] 好数 好数 一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位……)上的数字是奇数,偶数位(十位、千位、十万位……)上的数字是偶数,我们就称之为“好数”。 给定一…...

对中文汉字排序的方法总结
写在前面 在各个系统中,都随处可见根据某个字段进行升序(ASC)或降序(DESC)进行排序展示。但进行中文汉字排序和查找的时候,对中文汉字的排序和查找结果往往都是错误的。 为了尽量提供全面的解决方法,本文会从各个层面出发告知有需要的人对应…...

【解决报错】AttributeError: ‘NoneType‘ object has no attribute ‘group‘
学习爬虫时,遇到如下报错: 报错原因: 正则表达式的 search 或 finditer 方法没有找到任何匹配项,可能是换行符处理不当等。 解决方法如下: 在正则表达式末尾加上re.S即可,re.S是一个编译标志,…...

数据结构经典算法总复习(上卷)
第一章:数据结构导论 无重要考点,仅需了解时间复杂度。 第二章:线性表 1.获得线性表第i个元素 void GetElem_sq(SqList L, int i, ElemType &e) {if (i<1 || i>L.length) ErrorMsg("Invalid i value"); //注意错误监…...
JS获取URL中参数值的4种方法
方法1:现代浏览器都支持 URL 和 URLSearchParams 对象,可以很方便地从URL中提取参数 // 假设当前URL为 "https://example.com/?nameJohn&age30" const url new URL(window.location.href); // 或者你可以直接传入一个URL字符串 const …...

【面经】2024年软件测试面试题,精选100 道(附答案)
测试技术面试题 1、我现在有个程序,发现在 Windows 上运行得很慢,怎么判别是程序存在问题还是软硬件系统存在问题? 2、什么是兼容性测试?兼容性测试侧重哪些方面? 3、测试的策略有哪些? 4、正交表测试用…...

LabVIEW水泵性能测试系统
在现代工业应用中,水泵作为一种广泛使用的流体输送设备,其性能的可靠性对整个生产系统的稳定运行至关重要。通过LabVIEW软件配合专业硬件设备,设计了一套水泵性能测试系统,实现对各类水泵的综合性能测试与分析,提升水泵…...
React 第十九节 useLayoutEffect 用途使用技巧注意事项详解
1、概述 useLayoutEffect 是useEffect 的一个衍生版本,只是他们的执行时机不同 useLayoutEffect 用于在DOM更新执行完成之后,浏览器渲染绘制之前执行,这会阻塞浏览器的渲染; useEffect 的执行时机是在组件首次渲染和更新渲染之后…...

重温设计模式--2、设计模式七大原则
文章目录 1、开闭原则(Open - Closed Principle,OCP)定义:示例:好处: 2、里氏替换原则(Liskov Substitution Principle,LSP)定义:示例:好处&#…...

【NLP高频面题 - Transformer篇】Transformer的位置编码是如何计算的?
【NLP高频面题 - Transformer篇】Transformer的位置编码是如何计算的? 重要性:★★★ NLP Github 项目: NLP 项目实践:fasterai/nlp-project-practice 介绍:该仓库围绕着 NLP 任务模型的设计、训练、优化、部署和应用…...
基于SSM(Spring + Spring MVC + MyBatis)框架构建一个图书馆仓储管理系统
基于SSM(Spring Spring MVC MyBatis)框架构建一个图书馆仓储管理系统是一个涉及多个功能模块的项目,包括但不限于图书管理、读者管理、借阅管理、归还管理等。 1. 环境准备 确保你已经安装了以下工具和环境: Java Developmen…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...