亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++中浮點(diǎn)數(shù)、double類型如何與0值作比較詳解

 更新時(shí)間:2025年03月27日 09:46:13   作者:SunkingYang  
浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)機(jī)制和整型數(shù)不同,其有舍入誤差,在計(jì)算機(jī)中用近似表示任意某個(gè)實(shí)數(shù),這篇文章主要介紹了C++中浮點(diǎn)數(shù)、double類型如何與0值作比較的相關(guān)資料,需要的朋友可以參考下

前言

在C++中,由于浮點(diǎn)數(shù)(float/double)的存儲(chǔ)方式和精度問(wèn)題,直接與 0 進(jìn)行相等性比較(如 ==)可能導(dǎo)致意外結(jié)果。以下從原理、正確比較方法及代碼示例三個(gè)方面詳細(xì)說(shuō)明:

一、浮點(diǎn)數(shù)與0比較的問(wèn)題根源

  • 浮點(diǎn)數(shù)的精度問(wèn)題

    • 浮點(diǎn)數(shù)在內(nèi)存中以二進(jìn)制科學(xué)計(jì)數(shù)法存儲(chǔ)(遵循IEEE 754標(biāo)準(zhǔn)),某些十進(jìn)制小數(shù)無(wú)法精確表示。
    • 例如:0.1 在二進(jìn)制中是無(wú)限循環(huán)小數(shù),實(shí)際存儲(chǔ)時(shí)會(huì)存在舍入誤差。
    • 運(yùn)算過(guò)程中累積的微小誤差可能導(dǎo)致理論上應(yīng)為 0 的值實(shí)際為一個(gè)極小的非零值(如 1e-16)。
  • 直接比較的陷阱

    double a = 0.1 + 0.1 + 0.1;  // 理論值0.3,實(shí)際可能為0.30000000000000004
    if (a == 0.3) { /* 可能不成立 */ }
    

二、正確比較方法

1. 比較浮點(diǎn)數(shù)是否為0

使用一個(gè)極小的閾值(epsilon)判斷浮點(diǎn)數(shù)是否接近0:

#include <cmath>  // 使用fabs

bool isZero(double value, double epsilon = 1e-9) {
    return std::fabs(value) < epsilon;
}

// 示例用法
double x = 1e-10;
if (isZero(x)) {
    std::cout << "x可視為0" << std::endl;
}

2. 比較兩個(gè)浮點(diǎn)數(shù)是否相等

比較兩個(gè)浮點(diǎn)數(shù)的差值是否在允許范圍內(nèi):

bool areEqual(double a, double b, double epsilon = 1e-9) {
    return std::fabs(a - b) < epsilon;
}

// 示例用法
double a = 0.1 + 0.1 + 0.1;
double b = 0.3;
if (areEqual(a, b)) {
    std::cout << "a和b在誤差范圍內(nèi)相等" << std::endl;
}

三、關(guān)鍵注意事項(xiàng)

  • 選擇合理的epsilon

    • epsilon 的取值需結(jié)合具體場(chǎng)景:
      • 普通應(yīng)用:1e-9(適合大多數(shù)情況)。
      • 科學(xué)計(jì)算:可能需要更小的值(如 1e-15)。
    • 避免硬編碼:使用常量或通過(guò) std::numeric_limits 獲取機(jī)器精度:
      #include <limits>
      const double epsilon = std::numeric_limits<double>::epsilon();
      
  • 避免比較中的陷阱

    • 不要直接比較浮點(diǎn)數(shù)
      // 錯(cuò)誤做法
      if (x == 0.0) { /* 不可靠 */ }
      
    • 考慮相對(duì)誤差
      對(duì)于較大數(shù)值,可能需要結(jié)合相對(duì)誤差比較(例如判斷兩個(gè)值是否在1%誤差范圍內(nèi))。
  • 特殊值的處理

    • NaN(非數(shù)值):需用 std::isnan() 檢測(cè)。
    • 無(wú)窮大:用 std::isinf() 檢測(cè)。
    double x = std::sqrt(-1.0);  // 產(chǎn)生NaN
    if (std::isnan(x)) {
        std::cout << "x是非數(shù)值" << std::endl;
    }
    

四、完整示例代碼

#include <iostream>
#include <cmath>
#include <limits>

// 判斷是否為0
bool isZero(double value, double epsilon = 1e-9) {
    return std::fabs(value) < epsilon;
}

// 判斷兩個(gè)浮點(diǎn)數(shù)是否相等
bool areEqual(double a, double b, double epsilon = 1e-9) {
    return std::fabs(a - b) < epsilon;
}

int main() {
    double a = 0.1 + 0.1 + 0.1;  // 實(shí)際值約為0.30000000000000004
    double b = 0.3;

    // 直接比較失敗
    if (a == b) {
        std::cout << "直接比較:相等" << std::endl;
    } else {
        std::cout << "直接比較:不相等" << std::endl;
    }

    // 使用誤差范圍比較成功
    if (areEqual(a, b)) {
        std::cout << "誤差比較:相等" << std::endl;
    }

    // 判斷是否為0
    double x = 1e-10;
    if (isZero(x)) {
        std::cout << "x可視為0" << std::endl;
    }

    return 0;
}

五、總結(jié)

操作正確方法錯(cuò)誤方法
判斷浮點(diǎn)數(shù)是否為0fabs(val) < epsilonval == 0.0
判斷兩個(gè)浮點(diǎn)數(shù)是否相等fabs(a - b) < epsilona == b
處理特殊值(NaN/Inf)std::isnan(val) / std::isinf(val)直接比較

遵循上述方法,可避免因浮點(diǎn)數(shù)精度問(wèn)題導(dǎo)致的邏輯錯(cuò)誤,確保代碼的健壯性。

到此這篇關(guān)于C++中浮點(diǎn)數(shù)、double類型如何與0值作比較的文章就介紹到這了,更多相關(guān)C++浮點(diǎn)數(shù)、double與0值比較內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言fillpoly函數(shù)詳解

    C語(yǔ)言fillpoly函數(shù)詳解

    在C語(yǔ)言中,fillpoly函數(shù)的功能是畫(huà)一個(gè)多邊形,并且把多邊形填充。填充邊框所定義的多邊形的內(nèi)部。fillpoly 函數(shù)的用法:void far fillpoly(int numpoints, int far *polypoints);。
    2015-10-10
  • 一篇文章帶你了解C語(yǔ)言浮點(diǎn)數(shù)之間的比較規(guī)則

    一篇文章帶你了解C語(yǔ)言浮點(diǎn)數(shù)之間的比較規(guī)則

    這篇文章主要介紹了魔性的float浮點(diǎn)數(shù)精度問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • Clion(CMake工具)中引入第三方庫(kù)的詳細(xì)方法

    Clion(CMake工具)中引入第三方庫(kù)的詳細(xì)方法

    這篇文章主要介紹了Clion(CMake工具)中引入第三方庫(kù)的詳細(xì)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • C++調(diào)用matlab引擎實(shí)現(xiàn)三維圖的繪制

    C++調(diào)用matlab引擎實(shí)現(xiàn)三維圖的繪制

    這篇文章主要為大家詳細(xì)介紹了C++如何調(diào)用matlab引擎實(shí)現(xiàn)三維圖的繪制,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++和Matlab有一定的幫助,需要的可以參考一下
    2022-12-12
  • C++最短路徑Dijkstra算法的分析與具體實(shí)現(xiàn)詳解

    C++最短路徑Dijkstra算法的分析與具體實(shí)現(xiàn)詳解

    經(jīng)典的求解最短路徑算法有這么幾種:廣度優(yōu)先算法、Dijkstra算法、Floyd算法。本文是對(duì)?Dijkstra算法的總結(jié),該算法適用于帶權(quán)有向圖,可求出起始頂點(diǎn)到其他任意頂點(diǎn)的最小代價(jià)以及對(duì)應(yīng)路徑,希望對(duì)大家有所幫助
    2023-03-03
  • C++實(shí)現(xiàn)LeetCode(174.地牢游戲)

    C++實(shí)現(xiàn)LeetCode(174.地牢游戲)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(174.地牢游戲),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++智能指針shared_ptr

    C++智能指針shared_ptr

    這篇文章主要介紹了C++智能指針shared_ptr,C++11中包括shared_ptr在內(nèi)的多種指針,都是模板類型,意味著使用者可以指定想要操作的類型下文從shared_ptr創(chuàng)建方式展開(kāi)全文,介紹詳細(xì)具有一的參考價(jià)值,需要的小伙伴可以參考一下
    2022-03-03
  • C++編程語(yǔ)言中賦值運(yùn)算符重載函數(shù)(operator=)的使用

    C++編程語(yǔ)言中賦值運(yùn)算符重載函數(shù)(operator=)的使用

    本文主要介紹了C++編程語(yǔ)言中賦值運(yùn)算符重載函數(shù)(operator=)介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C語(yǔ)言動(dòng)態(tài)鏈表實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)

    C語(yǔ)言動(dòng)態(tài)鏈表實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言動(dòng)態(tài)鏈表實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C語(yǔ)言基礎(chǔ)之二分查找知識(shí)最全匯總

    C語(yǔ)言基礎(chǔ)之二分查找知識(shí)最全匯總

    這篇文章主要介紹了C語(yǔ)言基礎(chǔ)之二分查找知識(shí)最全匯總,文中有非常詳細(xì)的二分查找基礎(chǔ)知識(shí)詳解,對(duì)正在學(xué)習(xí)C語(yǔ)言基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04

最新評(píng)論