当前位置: 首页 > 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…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...