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.pswp.cn/pingmian/75738.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75738.shtml
英文地址,請注明出處:http://en.pswp.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…