ABS函数c++

简介:

abs 函数用于计算一个数的绝对值,在 C++ 中它继承自 C 语言的标准库,其历史可以追溯到早期的 C 语言发展历程,以下是详细介绍:

早期编程语言的需求

在计算机编程的早期阶段,处理数学运算就是一项基本需求,而计算绝对值是其中常见的操作之一。在很多科学计算、工程应用和数据处理场景中,都需要使用绝对值。例如,在计算误差、距离或者比较大小时,绝对值能够帮助程序正确处理正数和负数的情况。

C 语言中的 abs 函数

C 语言作为一种广泛使用的系统编程语言,在其标准库中引入了 abs 函数。C 语言最早由丹尼斯・里奇(Dennis Ritchie)在 20 世纪 70 年代开发,用于编写 UNIX 操作系统。随着 C 语言的发展和标准化,abs 函数被纳入了 C 标准库中。

  • K&R C 时期:在 1978 年,布莱恩・柯林汉(Brian Kernighan)和丹尼斯・里奇(Dennis Ritchie)出版了《C 程序设计语言》(The C Programming Language)第一版,也就是通常所说的 K&R C。在这个阶段,abs 函数就已经存在,不过当时的标准还没有像后来那样完善。
  • ANSI C 标准(C89/C90):为了统一 C 语言的标准,美国国家标准协会(ANSI)在 1989 年制定了 C 语言的标准,称为 ANSI C 或者 C89。后来国际标准化组织(ISO)也采纳了这个标准,称为 C90。在这个标准中,abs 函数被正式规范,定义在 <stdlib.h> 头文件中,用于计算整数的绝对值。同时,在 <math.h> 头文件中也有类似功能的函数,用于处理浮点数。

C++ 对 abs 函数的继承和扩展

C++ 是在 C 语言的基础上发展起来的,继承了 C 语言的标准库。因此,C++ 也包含了 abs 函数。

  • 兼容 C 标准库:在 C++ 中,为了保持与 C 语言的兼容性,仍然可以使用 <cstdlib> 和 <cmath> 头文件来调用 abs 函数,其中 <cstdlib> 对应 C 语言的 <stdlib.h><cmath> 对应 <math.h>
  • 命名空间:C++ 引入了命名空间的概念,abs 函数被放在 std 命名空间中,因此在 C++ 中使用时需要写成 std::abs
  • 函数重载:C++ 支持函数重载,这意味着可以为不同类型的参数提供不同的 abs 函数实现。例如,<cstdlib> 中的 abs 函数主要用于处理整数类型,而 <cmath> 中的 abs 函数则用于处理浮点类型。

后续发展

随着 C++ 标准的不断演进,abs 函数的基本功能保持稳定,但 C++ 标准库在整体上不断完善和扩展。例如,在 C++11 及以后的标准中,引入了更多的类型和特性,但 abs 函数仍然是计算绝对值的常用工具。

优点

1. 简单易用

abs 函数的使用方法非常直观,只需传入一个数值,就能返回该数值的绝对值,无需复杂的参数设置或额外操作。无论是整数还是浮点数,都能通过简洁的代码调用 abs 函数完成绝对值计算。

2. 标准库支持

abs 函数是 C 和 C++ 标准库的一部分,这意味着它在所有支持 C 和 C++ 标准的编译器和平台上都能使用,具有高度的可移植性。开发者无需担心不同平台之间的兼容性问题,能够在各种环境下稳定地使用该函数进行绝对值计算。

3. 性能优化

标准库中的 abs 函数通常经过了编译器和库开发者的优化,其执行效率较高。编译器可能会将 abs 函数的调用优化为机器指令,以减少函数调用的开销,提高程序的运行速度。

4. 函数重载

在 C++ 中,abs 函数支持函数重载。<cstdlib> 中的 abs 函数用于处理整数类型,而 <cmath> 中的 abs 函数则用于处理浮点类型。这种特性使得开发者可以使用相同的函数名处理不同类型的数据,提高了代码的可读性和可维护性。

5. 广泛应用场景

在许多科学计算、工程应用、数据处理和算法实现中,计算绝对值是一个常见的操作。abs 函数为这些场景提供了方便的解决方案,例如在计算误差、距离、比较大小时都能发挥作用。

缺点

1. 整数溢出问题

当对整数类型(如 int)的最小负值求绝对值时,可能会出现溢出问题。因为最小负值的绝对值超出了该类型所能表示的最大值,会导致未定义行为。

2. 缺乏对自定义类型的支持

abs 函数只能处理标准的整数和浮点类型,对于自定义类型(如用户定义的复数类、向量类等),无法直接使用 abs 函数计算其 “绝对值”(如复数的模、向量的模长等)。开发者需要为自定义类型重载 abs 函数或者实现专门的方法来完成类似的计算。

3. 功能单一

abs 函数仅用于计算绝对值,功能比较单一。在一些复杂的数学计算中,可能需要更高级的数学函数或者算法来完成任务,abs 函数无法满足这些复杂的需求。例如,在处理矩阵时,需要计算矩阵元素的绝对值之和等操作,仅靠 abs 函数是不够的,还需要结合其他函数和算法来实现。

使用方法:

在 C++ 里,abs 函数可用于计算数值的绝对值,其使用方法会依据数据类型的不同而有所差异,下面分别介绍不同数据类型下 abs 函数的使用方式。

整数类型(<cstdlib>

当要计算整数(如 intlonglong long)的绝对值时,需要包含 <cstdlib> 头文件。

#include <iostream>
#include <cstdlib>int main() {int num1 = -20;long num2 = -30L;long long num3 = -40LL;int abs_num1 = std::abs(num1);long abs_num2 = std::abs(num2);long long abs_num3 = std::abs(num3);std::cout << "The absolute value of " << num1 << " is " << abs_num1 << std::endl;std::cout << "The absolute value of " << num2 << " is " << abs_num2 << std::endl;std::cout << "The absolute value of " << num3 << " is " << abs_num3 << std::endl;return 0;
}

上述代码中,std::abs 分别对 intlong 和 long long 类型的负数进行处理,返回它们的绝对值。

浮点类型(<cmath>

若要计算浮点数(如 floatdoublelong double)的绝对值,需包含 <cmath> 头文件。

#include <iostream>
#include <cmath>int main() {float num1 = -2.5f;double num2 = -3.7;long double num3 = -4.9L;float abs_num1 = std::abs(num1);double abs_num2 = std::abs(num2);long double abs_num3 = std::abs(num3);std::cout << "The absolute value of " << num1 << " is " << abs_num1 << std::endl;std::cout << "The absolute value of " << num2 << " is " << abs_num2 << std::endl;std::cout << "The absolute value of " << num3 << " is " << abs_num3 << std::endl;return 0;
}

在这段代码中,std::abs 对不同类型的浮点数求绝对值并输出结果。

注意事项

  • 命名空间:由于 abs 函数位于 std 命名空间,使用时需写成 std::abs,避免命名冲突。
  • 整数溢出问题:当对整数类型(如 int)的最小负值求绝对值时,可能会出现溢出问题,因为最小负值的绝对值超出了该类型所能表示的最大值。例如:
#include <iostream>
#include <cstdlib>
#include <limits>int main() {int min_int = std::numeric_limits<int>::min();int abs_min_int = std::abs(min_int);std::cout << "The absolute value of min int is " << abs_min_int << std::endl;return 0;
}

上述代码中,int 类型的最小负值求绝对值时会溢出,得到的结果并非预期值。

代码示例汇总

以下是将上述示例整合的完整代码:

#include <iostream>
#include <cstdlib>
#include <cmath>
#include <limits>int main() {// 整数类型int num1 = -20;long num2 = -30L;long long num3 = -40LL;int abs_num1 = std::abs(num1);long abs_num2 = std::abs(num2);long long abs_num3 = std::abs(num3);std::cout << "The absolute value of " << num1 << " is " << abs_num1 << std::endl;std::cout << "The absolute value of " << num2 << " is " << abs_num2 << std::endl;std::cout << "The absolute value of " << num3 << " is " << abs_num3 << std::endl;// 浮点类型float num4 = -2.5f;double num5 = -3.7;long double num6 = -4.9L;float abs_num4 = std::abs(num4);double abs_num5 = std::abs(num5);long double abs_num6 = std::abs(num6);std::cout << "The absolute value of " << num4 << " is " << abs_num4 << std::endl;std::cout << "The absolute value of " << num5 << " is " << abs_num5 << std::endl;std::cout << "The absolute value of " << num6 << " is " << abs_num6 << std::endl;// 整数溢出问题int min_int = std::numeric_limits<int>::min();int abs_min_int = std::abs(min_int);std::cout << "The absolute value of min int is " << abs_min_int << std::endl;return 0;
}    
希望这些代码能帮助您理解并解决这个问题,如果有问题,请随时提问。
  蒟蒻文章,神犇勿喷,点个赞再走吧!QAQ

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

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

相关文章

闭环SOTA!北航DiffAD:基于扩散模型实现端到端自动驾驶「多任务闭环统一」

端到端自动驾驶目前是有望实现完全自动驾驶的一条有前景的途径。然而&#xff0c;现有的端到端自动驾驶系统通常采用主干网络与多任务头结合的方式&#xff0c;但是它们存在任务协调和系统复杂度高的问题。为此&#xff0c;本文提出了DiffAD&#xff0c;它统一了各种驾驶目标并…

整车CAN网络和CANoe

车载网络中主要包含有Can网络,Lin网络,FlexRay,Most,以太网。 500kbps:500波特率,表示的数据传输的速度。表示的是最大的网速传输速度。也就是每秒 500kb BodyCan车身Can InfoCan娱乐信息Can 车身CAN主要连接的是ESB电动安全带 ADB自适应远光灯等 PTCan动力Can 底盘Can

实战设计模式之迭代器模式

概述 与上一篇介绍的解释器模式一样&#xff0c;迭代器模式也是一种行为设计模式。它提供了一种方法来顺序访问一个聚合对象中的各个元素&#xff0c;而无需暴露该对象的内部表示。简而言之&#xff0c;迭代器模式允许我们遍历集合数据结构中的元素&#xff0c;而不必了解这些集…

JVM 垃圾回收器是如何判断一个对象是否要回收?

JVM 垃圾回收器&#xff08;Garbage Collector&#xff09;需要判断哪些对象是“垃圾”&#xff0c;即不再被程序使用的对象&#xff0c;以便回收它们占用的内存。JVM 主要使用以下两种方法来判断对象是否是垃圾&#xff1a; 1. 引用计数算法 (Reference Counting): 原理&…

kali——httrack

目录 前言 使用教程 前言 HTTrack 是一款运行于 Kali Linux 系统中的开源网站镜像工具&#xff0c;它能将网站的页面、图片、链接等资源完整地下载到本地&#xff0c;构建出一个和原网站结构相似的离线副本。 使用教程 apt install httrack //安装httrack工具 httrac…

kotlin函数类型

一 函数类型定义 1 定义 函数类型就是 (Int, Int) -> Int 函数类型其实就是将函数的 “参数类型” 和 “返回值类型” 抽象出来 2 示例 &#xff1a; (Int, Int) -> Int 表示接收两个 Int 参数并返回 Int 的函数类型&#xff1b; (String) -> Unit 表示接收 Strin…

C# Winform 入门(9)之如何封装并调用dll

封装dll 首先创建 .Net平台 类库 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _09.Encapsulation_dll {public class Program{/// <summary>/// 求两个double类型的数值的和/// &l…

前后端分离下,Spring Boot 请求从发起到响应的完整执行流程

以下是前后端分离架构下&#xff0c;Spring Boot 请求从发起到响应的完整执行流程&#xff0c;结合你提出的所有问题&#xff0c;按真实执行顺序和职责链条重新整理所有核心概念、结构、关键类、数据转换点和典型代码示例&#xff1a; 一、前端发起请求&#xff08;步骤1-2&…

基于sklearn实现文本摘要思考

和各位小伙伴分享一下使用sklearn进行文本摘要的思考。 第一版本 原理 提取式文本摘要的基本原理是&#xff1a; 将文本分割成句子 计算每个句子的重要性(权重) 选择权重最高的几个句子组成摘要 常用的句子权重计算方法&#xff1a; TF-IDF&#xff1a;基于词频-逆文档频…

OpenHarmony子系统开发 - DFX(三)

OpenHarmony子系统开发 - DFX&#xff08;三&#xff09; 五、HiTraceMeter开发指导 HiTraceMeter概述 简介 HiTraceMeter在OpenHarmony中&#xff0c;为开发者提供业务流程调用链跟踪的维测接口。通过使用该接口所提供的功能&#xff0c;可以帮助开发者迅速获取指定业务流…

2025年 能够有效提升AI的生成质量和逻辑严谨性 的通用型系统提示

以下是三个经过精心设计的通用型系统提示&#xff08;System Prompt&#xff09;&#xff0c;能够有效提升AI的生成质量和逻辑严谨性&#xff0c;适用于各类对话、分析和创作场景&#xff1a; Prompt 1 - 专家级分步验证模式 你是一个具备跨领域知识整合能力的超级AI&#xff…

python爬虫:小程序逆向实战教程

根据我之前发表的文章&#xff0c;我们进行延伸实战https://blog.csdn.net/weixin_64809364/article/details/146981598?spm1001.2014.3001.5501 1. 想要爬取什么小程序&#xff0c;我们进行搜索 2. 找到我们vx小程序的文件地址&#xff0c;我们就可以进行破解 破解步骤强看…

C语言变长数组(VLA)详解:灵活处理动态数据的利器

引言 在C语言中&#xff0c;传统的数组大小必须在编译时确定&#xff0c;这限制了程序处理动态数据的灵活性。C99标准引入的变长数组&#xff08;Variable-Length Array, VLA&#xff09; 打破了这一限制&#xff0c;允许数组长度在运行时动态确定。本文将深入解析VLA的语法、…

串口数据转换为IP数据

串口数据转换为IP数据是一种常见的通信技术,用于将传统的串行设备(如传感器、控制器等)接入现代的IP网络。以下是详细介绍: 1. 转换原理 串口数据转换为IP数据的过程涉及硬件和软件的结合,核心是将串行数据封装为TCP/IP或UDP/IP数据包,通过网络传输。具体步骤如下: 硬…

client-go如何监听自定义资源

如何使用 client-go 监听自定义资源 在 Kubernetes 中使用 client-go 监听自定义资源&#xff08;Custom Resource&#xff0c;简称 CR&#xff09;需要借助 Dynamic Client 或 Custom Informer&#xff0c;因为 client-go 的标准 Clientset 只支持内置资源&#xff08;如 Pod…

C++软件开发架构

文章目录 1.全局消息通信MsgHandler.h单元测试(QTest)MsgHandlerUnitTest.hMsgHandlerUnitTest.cpp 2.实例间通信InstMsgHandler.h单元测试InstMsgHandlerUnitTest.hInstMsgHandlerUnitTest.cpp 1.全局消息通信 1. 适用于类与类单个对象实例之间的通信&#xff0c;多个对象需要…

AI Agent设计模式一:Chain

概念 &#xff1a;线性任务流设计 ✅ 优点&#xff1a;逻辑清晰易调试&#xff0c;适合线性处理流程❌ 缺点&#xff1a;缺乏动态分支能力 from typing import TypedDictfrom langgraph.graph import StateGraph, END# 定义后续用到的一些变量 class CustomState(TypedDict):p…

Git三剑客:工作区、暂存区、版本库深度解析

一、引言&#xff1a;为什么需要理解Git的核心区域&#xff1f; 作为开发者&#xff0c;Git是日常必备的版本控制工具。但你是否曾因以下问题感到困惑&#xff1f; 修改了文件&#xff0c;但 git status 显示一片混乱&#xff1f; git add 和 git commit 到底做了什么&#x…

Python数据类型-list

列表(List)是Python中最常用的数据类型之一&#xff0c;它是一个有序、可变的元素集合。 1. 列表基础 创建列表 empty_list [] # 空列表 numbers [1, 2, 3, 4, 5] # 数字列表 fruits [apple, banana, orange] # 字符串列表 mixed [1, hello, 3.14, True] # 混合类型…

Keepalive+LVS+Nginx+NFS高可用项目

项目架构 分析 主机规划 主机系统安装应用网络IPclientredhat 9.5无NAT172.25.250.115/24lvs-masterrocky 9.5ipvsadm&#xff0c;keepalivedNAT172.25.250.116/24 VIP 172.25.250.100/32lvs-backuprocky 9.5ipvsadm&#xff0c;keepalivedNAT172.25.250.117/24 VIP 172.25.2…