【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,它们经过高度优化并且能够处理更多边界情况。


在这里插入图片描述


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/65033.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

合合信息:探索视觉内容安全新前沿

2024年12月13日-15日&#xff0c;中国图象图形学学会在杭州召开。大会期间&#xff0c;来自合合信息的图像算法研发总监郭丰俊进行了主题为“视觉内容安全技术的前沿进展与应用”的演讲&#xff0c;介绍了视觉内容安全问题&#xff0c;并总结了现今的技术发展&#xff0c;对我很…

【JetPack】Navigation知识点总结

Navigation的主要元素&#xff1a; 1、Navigation Graph&#xff1a; 一种新的XML资源文件,包含应用程序所有的页面&#xff0c;以及页面间的关系。 <?xml version"1.0" encoding"utf-8"?> <navigation xmlns:android"http://schemas.a…

教师如何打造专属私密成绩查询系统?

期末的校园&#xff0c;被一种特殊的氛围所笼罩。老师们如同辛勤的工匠&#xff0c;精心打磨着每一个教学环节。复习阶段&#xff0c;他们在知识的宝库中精挑细选&#xff0c;把一学期的重点内容一一梳理&#xff0c;为学生们打造出系统的复习框架。课堂上&#xff0c;他们激情…

.NET周刊【12月第3期 2024-12-15】

国内文章 重磅推出 Sdcb Chats&#xff1a;一个全新的开源大语言模型前端 https://www.cnblogs.com/sdcb/p/18597030/sdcb-chats-intro Sdcb Chats是一个新推出的开源大语言模型前端&#xff0c;旨在提升用户交互体验&#xff0c;并填补市场上基于.NET的前端空白。它引入树状…

专栏二十三:Python读取和分析空间数据的经验杂谈

部分情况同样适合单细胞的分析结果 读取数据阶段 1.错误的library_id 包括sc和sq的两种读取方式&#xff0c;大同小异。 理论上有h5数据和spatial文件夹就可以读取成功&#xff0c;并且自动赋予和文件名一样的library_id&#xff0c;例如 slide sq.read.visium("/ho…

Pandas系列|第二期:Pandas中的数据结构

1.Pandas中的数据结构&#xff1a;Series和DataFrame Pandas 的主要数据结构是 Series &#xff08;一维数据&#xff09;与 DataFrame&#xff08;二维数据&#xff09;&#xff0c;这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。 Series 是一…

如何在谷歌浏览器中启用语音搜索

想象一下&#xff0c;你正在拥挤的地铁上&#xff0c;双手都拿着沉重的购物袋&#xff0c;突然你想搜索附近的咖啡馆。此时如果你能通过语音而不是打字来进行搜索&#xff0c;那将多么的便利&#xff01;在谷歌浏览器中&#xff0c;启用语音搜索功能就是这么简单而高效&#xf…

GCP GCA认证考试Case错题库1(JenciMart+Helicopter+EHR)

GCP GCA认证考试Case错题库1(JenciMartHelicopterEHR) 整理by Moshow郑锴https://zhengkai.blog.csdn.net/ JenciMart 在生产和开发资源之间进行管理职责分离的最小权限模型中&#xff0c;最佳实践是每个应用程序的每个阶段都有自己的项目。这种设置确保权限是细化的&#xf…

MySQL HA 方案 MMM、MHA、MGR、PXC 对比

MySQL高可用架构 MMM (Multi Master Replication Manager) 资源数量说明主DB2用于主备模式的主主复制从DB0~N台可以根据需要配置N台从服务器IP地址2n1N为MySQL服务器的数量监控用户1用户监控数据库状态的MySQL用户(replication)代理用户1用于MMM代理端改变read_only状态 故障…

ISO17025最新认证消息

ISO17025认证是国际上广泛认可的实验室管理标准&#xff0c;全称为《检测和校准实验室能力的通用要求》&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;和国际电工委员会&#xff08;IEC&#xff09;联合发布。以下是对ISO17025最新认证消息及相关内容的归纳&#xf…

npm淘宝镜像

通过命令行配置npm的淘宝镜像源和官方镜像源&#xff0c;以及如何安装和使用cnpm来解决安装包卡顿或无法安装的问题。通过设置registry和disturl&#xff0c;配合清理缓存&#xff0c;可以优化npm的下载速度。 1、​官方默认镜像 npm config set registry https://registry.n…

java12.24日记

运算符&#xff1a; 算术运算符&#xff1a; 顾名思义进行算数运算的 多为&#xff1a;四则运算&#xff0c;加一个取余 &#xff0c;-&#xff0c;*&#xff0c;/以及 %&#xff08;取余&#xff09; 而外的&#xff1a;自增 以及自减--&#xff0c;对原数进行1或者-1 i…

SAP SD销售订单处理流程

本篇博文中的流程&#xff1a; 创建销售订单→依据销售订单创建交货单→依据销售订单开票 一、VA01创建销售订单 1、填入必填项&#xff0c;回车。可点击左上角的依照参考创建按钮。 依照参考创建可以参考以下6个。其中询价单、报价单、订单、合同和计划协议可以理解为特殊的…

内网穿透ubuntu20 docker coplar

sudo apt-get install curl curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash ubuntu-base报错 /sbin/init:No such file or directory解决办法 apt install systemd 命令安装即可 cpolar version 1.3 token认证 登录cpolar官网后台…

怎么设置电脑密码?Windows和Mac设置密码的方法

为电脑设置密码是保护个人信息安全的重要措施。无论是Windows系统还是MacOS系统&#xff0c;设置密码的步骤都相对简单&#xff0c;但需要根据不同的操作系统选择不同的方法。 一、Windows系统电脑密码设置 方法一&#xff1a;通过控制面板设置账户密码 点击桌面左下角的“开…

机器学习DAY3 : 线性回归与最小二乘法与sklearn实现 (线性回归完)

线性回归 线性回归是一种较为简单&#xff0c;但十分重要的机器学习方法。掌握线性的原理及求解方法&#xff0c;是深入了解线性回归的基本要求。除此之外&#xff0c;线性回归也是监督学习回归部分的基石&#xff0c;希望你能通过本文掌握机器学习的一些重要的思想。 知识点…

Linux下编译安装Kokkos

本文记录在Linux下编译安装Kokkos的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1oneAPI2024.2.1 一、安装依赖 二、编译安装 参考文献 Mills R T. PETSc/TAO Developments for Early Exascale Systems[J]. 2024.Josef R. A Stud…

eMMC 存储分区结构解析

一、eMMC 存储分区结构图 分区 用途 Boot Area Partitions 存储引导加载程序&#xff0c;支持安全启动和恢复模式 RPMB Partition 存储安全关键数据&#xff0c;防止重放攻击 General Purpose Partitions OEM 自定义数据分区&#xff0c;用于特定功能或镜像存储 User D…

攻防世界web第一题

最近开始学习网络安全的相关知识&#xff0c;开启刷题&#xff0c;当前第一题 题目为攻防世界web新手题 这是题目 翻译&#xff1a;在这个训练挑战中&#xff0c;您将了解 Robots_exclusion_standard。网络爬虫使用 robots.txt 文件来检查是否允许它们对您的网站或仅网站的一部…

C++可执行文件参数解析

前言 针对简单工程甚至是单cpp文件&#xff0c;C可执行二进制的参数获取&#xff0c;getopt被用来解析命令行选项参数。该接口在unix的头文件<unistd.h>中定义。参数类型区分为短参数&#xff08;只有一个中划线’-&#xff09;、长参数&#xff08;有2个中划线‘–’&a…