当前位置: 首页 > news >正文

【C++】ceil 和 floor 函数的实现与分析


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯ceil 和 floor 函数的基础介绍
    • 1. ceil 函数
      • 定义与功能
      • 示例代码
      • 输出结果
      • 功能分析
      • 使用场景
    • 2. floor 函数
      • 定义与功能
      • 示例代码
      • 输出结果
      • 功能分析
      • 使用场景
  • 💯自行实现 ceil 和 floor 函数
    • 1. 自行实现 ceil 函数
      • 代码实现
      • 示例输入输出
      • 优化
    • 2. 自行实现 floor 函数
      • 代码实现
      • 示例输入输出
  • 💯`(int)` 类型转换的局限性
      • 具体原因
      • 示例
  • 💯小结


在这里插入图片描述


💯前言

  • 在日常的编程任务中,处理浮点数的向上取整和向下取整是一个非常常见的需求。C++ 提供了强大的数学库 <cmath>,其中包含了 ceilfloor 函数,分别用于实现向上取整和向下取整的功能。然而,有些场景可能需要我们自行实现这些功能,以便深入理解其底层逻辑,或者针对某些特殊需求进行优化和扩展。
    本文将通过代码实例详细分析 ceilfloor 的功能、实现思路及其扩展,包括自行实现的方式。同时,针对读者可能会遇到的问题,比如 (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 向上取整为 33.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 向下取整为 23.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;
}

在这里插入图片描述

示例输入输出

  1. 输入:3.14

    • 整数部分:3
    • 小数部分:0.14
    • 输出:4
  2. 输入:5.00

    • 整数部分:5
    • 小数部分:0
    • 输出:5
  3. 输入:-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;
}

示例输入输出

  1. 输入:3.14
    • 输出:3
  2. 输入:-3.14
    • 输出:-4

💯(int) 类型转换的局限性

在讨论 ceilfloor 的实现时,(int) 强制类型转换是一个常见的手段,但它并不完全等同于 ceilfloor,特别是在处理负数时。

具体原因

  • (int) 强制类型转换会直接截断小数部分(舍弃小数部分),相当于向零方向取整。
  • 对正数:效果等同于 floor
  • 对负数:效果既不等同于 ceil,也不等同于 floor

示例

输入值(int) 转换ceil 结果floor 结果
3.14343
-3.14-3-3-4

💯小结

  • ceilfloor 是 C++ 中处理浮点数取整的两个重要函数,其核心在于处理小数部分的舍入方式。
  • (int) 强制转换可以用于简单的取整,但在负数场景下需要特别注意。
  • 自行实现 ceilfloor 的过程能够帮助我们更好地理解这两个函数的逻辑,同时也能根据实际需求进行定制。

建议在实际开发中,优先使用标准库函数 ceilfloor,它们经过高度优化并且能够处理更多边界情况。


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

相关文章:

【C++】ceil 和 floor 函数的实现与分析

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

zabbix监控山石系列Hillstone配置模版(适用于zabbix6及以上)

监控项&#xff1a; 触发器&#xff1a; 监控数据&#xff1a;...

在瑞芯微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. 引言 在前面的文章中&#xff0c;我们学习了如何在 views_examples 中添加自定义 Button 示例。在本篇文章中&#xff0c;我们将继续探索 Views 框架的应用&#xff0c;创建一个简单的计数器示例&#xff0c;以学习如何使用 Label 和 Button 控件进行交互&#xff0c;以及如…...

一步一步写线程之十六线程的安全退出之二例程

一、说明 在一篇分析了多线程的安全退出的相关机制和方式&#xff0c;那么本篇就针对前一篇的相关的分析进行举例分析。因为有些方法实现的方法类似&#xff0c;可能就不一一重复列举了&#xff0c;相关的例程主要以在Linux上的运行为主。 二、实例 线程间的同步&#xff0c…...

【Linux系列】Shell 脚本中的条件判断:`[ ]`与`[[ ]]`的比较

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

ArcGIS+MIKE21 洪水淹没分析、溃坝分析,洪水淹没动态效果

洪水淹没分析过程&#xff1a; 一、所需数据&#xff1a; 1.分析区域DEM数据 二、ArcGIS软件 1.提取分析区域DEM&#xff08;水库坝下区域&#xff09; 2.DEM栅格转点 3.计算转换后几何点的x和y坐标值&#xff08;精度20、小数位3&#xff09; 4.导出属性表&#xff0c;形式…...

Git 的基本概念和使用

Git是一个分布式版本控制系统&#xff0c;它可以帮助开发人员追踪和管理代码的修改。下面是Git的基本概念和使用方式的解释&#xff1a; 仓库&#xff08;Repository&#xff09;&#xff1a;Git使用仓库来存储代码和版本历史记录。仓库可以位于本地计算机上&#xff0c;也可以…...

*【每日一题 基础题】 [蓝桥杯 2024 省 B] 好数

[蓝桥杯 2024 省 B] 好数 好数 一个整数如果按从低位到高位的顺序&#xff0c;奇数位&#xff08;个位、百位、万位……&#xff09;上的数字是奇数&#xff0c;偶数位&#xff08;十位、千位、十万位……&#xff09;上的数字是偶数&#xff0c;我们就称之为“好数”。 给定一…...

对中文汉字排序的方法总结

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

【解决报错】AttributeError: ‘NoneType‘ object has no attribute ‘group‘

学习爬虫时&#xff0c;遇到如下报错&#xff1a; 报错原因&#xff1a; 正则表达式的 search 或 finditer 方法没有找到任何匹配项&#xff0c;可能是换行符处理不当等。 解决方法如下&#xff1a; 在正则表达式末尾加上re.S即可&#xff0c;re.S是一个编译标志&#xff0c…...

数据结构经典算法总复习(上卷)

第一章&#xff1a;数据结构导论 无重要考点&#xff0c;仅需了解时间复杂度。 第二章&#xff1a;线性表 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&#xff1a;现代浏览器都支持 URL 和 URLSearchParams 对象&#xff0c;可以很方便地从URL中提取参数 // 假设当前URL为 "https://example.com/?nameJohn&age30" const url new URL(window.location.href); // 或者你可以直接传入一个URL字符串 const …...

【面经】2024年软件测试面试题,精选100 道(附答案)

测试技术面试题 1、我现在有个程序&#xff0c;发现在 Windows 上运行得很慢&#xff0c;怎么判别是程序存在问题还是软硬件系统存在问题&#xff1f; 2、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 3、测试的策略有哪些&#xff1f; 4、正交表测试用…...

LabVIEW水泵性能测试系统

在现代工业应用中&#xff0c;水泵作为一种广泛使用的流体输送设备&#xff0c;其性能的可靠性对整个生产系统的稳定运行至关重要。通过LabVIEW软件配合专业硬件设备&#xff0c;设计了一套水泵性能测试系统&#xff0c;实现对各类水泵的综合性能测试与分析&#xff0c;提升水泵…...

React 第十九节 useLayoutEffect 用途使用技巧注意事项详解

1、概述 useLayoutEffect 是useEffect 的一个衍生版本&#xff0c;只是他们的执行时机不同 useLayoutEffect 用于在DOM更新执行完成之后&#xff0c;浏览器渲染绘制之前执行&#xff0c;这会阻塞浏览器的渲染&#xff1b; useEffect 的执行时机是在组件首次渲染和更新渲染之后…...

重温设计模式--2、设计模式七大原则

文章目录 1、开闭原则&#xff08;Open - Closed Principle&#xff0c;OCP&#xff09;定义&#xff1a;示例&#xff1a;好处&#xff1a; 2、里氏替换原则&#xff08;Liskov Substitution Principle&#xff0c;LSP&#xff09;定义&#xff1a;示例&#xff1a;好处&#…...

【NLP高频面题 - Transformer篇】Transformer的位置编码是如何计算的?

【NLP高频面题 - Transformer篇】Transformer的位置编码是如何计算的&#xff1f; 重要性&#xff1a;★★★ NLP Github 项目&#xff1a; NLP 项目实践&#xff1a;fasterai/nlp-project-practice 介绍&#xff1a;该仓库围绕着 NLP 任务模型的设计、训练、优化、部署和应用…...

基于SSM(Spring + Spring MVC + MyBatis)框架构建一个图书馆仓储管理系统

基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架构建一个图书馆仓储管理系统是一个涉及多个功能模块的项目&#xff0c;包括但不限于图书管理、读者管理、借阅管理、归还管理等。 1. 环境准备 确保你已经安装了以下工具和环境&#xff1a; Java Developmen…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

【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开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;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&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...