最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C/C++浮點數(shù)使用的兩個注意事項詳解

 更新時間:2023年02月06日 09:31:02   作者:擺爛小青菜  
浮點數(shù)都是有符號的,沒有 unsigned 浮點數(shù),下面這篇文章主要給大家介紹了關(guān)于C/C++浮點數(shù)使用的兩個注意事項,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下

一.回顧浮點數(shù)的存儲與讀取

浮點數(shù)的存入與讀取流程總覽:

二.浮點數(shù)使用的第一個注意事項

由于浮點數(shù)存入時很可能發(fā)生有效數(shù)值M二進制序列的截斷以及被截去的序列的最高位的四舍五入而造成精度損失,所以兩個浮點數(shù)直接用操作符進行比較很可能會得到不符合預(yù)期的結(jié)果。

舉個例子:

int main()
{
    float a = 3.12f;
    a += 0.02f;
   
    float b = 3.14f;
 
    std::cout << (a == b) << std::endl;
    std::cout << (a > b) << std::endl;
    std::cout << (a < b) << std::endl;
 
    return 0;
}

簡單調(diào)試一下代碼:

上述代碼中,a最終的值和b的值在數(shù)學(xué)上應(yīng)該是相同的,但是由于精度丟失而導(dǎo)致了最后a<b,如果這時a和b直接用運算符進行比較則無法得到預(yù)期的結(jié)果。

兩個浮點數(shù)的比較應(yīng)該使用如下方式:

對于浮點數(shù)而言比較合適的精度為:0.000001

對于雙進度浮點數(shù)而言比較合適的精度為:0.0000000000000001

因此可以定義兩個宏:

#define epf 1e-6
#define epd 1e-16

f,f1,f2代表單精度浮點數(shù),d,d1,d2代表雙精度浮點數(shù)。

判斷浮點數(shù)是否等于0:

要判斷一個單精度浮點數(shù)是否等于0:if(fabs(f) <= eps );
要判斷一個雙精度浮點數(shù)是否等于0:if(fabs(d) <= epd);
判斷兩個浮點數(shù)是否相等:

要判斷兩個單精度浮點數(shù)是否相等:if(fabs(f1 - f2) <= eps);
要判斷兩個雙精度浮點數(shù)是否相等:if(fabs(d1 - d2) <= epd);

注:fabs是求浮點數(shù)絕對值的函數(shù)。聲明在<iostream>頭文件中。

#define eps 1e-6
int main()
{
    float a = 3.12f;
    a +=0.02f;
    float b = 3.14f;
    if (fabs(a - b) <= eps)
    {
        std::cout << "a==b" << std::endl;
    }
    else
    {
        std::cout << "a!=b" << std::endl;
    }
    return 0;
}

三.浮點數(shù)使用的第二個注意事項 

由于浮點數(shù)存入時可能發(fā)生數(shù)據(jù)截斷,因此兩個絕對值相差巨大的浮點數(shù)進行加減運算很多時候是沒有意義的。

以十進制數(shù)為例來說明這個問題:

代碼驗證:

int main()
{
    float a = 1e38;
    std::cout << a << std::endl;
    
    float b = 1000;
    a = a + b;
    std::cout << a << std::endl;
 
    a = a - b;
    std::cout << a << std::endl;
    return 0;
}

附: 觀察內(nèi)存中的FLT_MAX和FLT_MIN

C/C++中的FLT_MAX都被宏定義為浮點數(shù)絕對值最大的值

將FLT_MAX存入內(nèi)存中:

將a的二進制序列分割為SEM的形式 :

其指數(shù)位不是全1

C/C++中的FLT_MIN被宏定義為絕對值最接近于0的浮點數(shù) 

將FLT_MIN存入內(nèi)存中:

其指數(shù)位不是全0 

補充:C 語言兩個浮點數(shù)比較大小的辦法

浮點數(shù)并非真正意義上的實數(shù),只是其在某個范圍內(nèi)的近似。

因此兩個浮點數(shù)比較大小時,不能簡單地使用大于小于號進行比較,應(yīng)該判斷連個浮點數(shù)差值的絕對值是否近似為0。

#include <stdio.h>
#include <math.h>
 
// 這里的 EPS 是自己定義的精度
#define EPS 1e-7     // 判斷浮點數(shù)是否位于0的一個很小的鄰域內(nèi)[-EPS,EPS]內(nèi)

int main(void)
{
    /* 判斷一個浮點數(shù)是否等于 0*/
    float a;
    scanf("%f", &a);
    if(fabs(a) <= EPS)  // a=0
        ...
    else if(a > EPS)    // a>0
        ...
    else                // a<0
        ...
 
    /* 比較兩個浮點數(shù)大小 */
    float a,b;
    scanf("%f%f",&a, &b);
    if(fabs(a-b) <= EPS)  // a=b
        ...
    else if( (a-b) > EPS)  // a>b
        ...
    else                   // a<b
        ...
}

總結(jié)

到此這篇關(guān)于C/C++浮點數(shù)使用的兩個注意事項的文章就介紹到這了,更多相關(guān)C/C++浮點數(shù)注意事項內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一波二叉樹遍歷問題的C++解答實例分享

    一波二叉樹遍歷問題的C++解答實例分享

    這篇文章主要介紹了一波二叉樹遍歷問題的C++解答實例分享,包括節(jié)點打印和轉(zhuǎn)換為鏡像等問題的解答,需要的朋友可以參考下
    2016-02-02
  • 一文詳解QDialog中exec與open的區(qū)別

    一文詳解QDialog中exec與open的區(qū)別

    這篇文章主要為大家詳細(xì)介紹了QDialog中exec與open的區(qū)別,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Qt有一定的幫助,需要的可以參考一下
    2023-03-03
  • C++制作簡單的計算器功能

    C++制作簡單的計算器功能

    這篇文章主要為大家詳細(xì)介紹了C++制作簡單的計算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 舉例解析設(shè)計模式中的工廠方法模式在C++編程中的運用

    舉例解析設(shè)計模式中的工廠方法模式在C++編程中的運用

    這篇文章主要介紹了設(shè)計模式中的工廠方法模式在C++編程中的運用,文中也對簡單工廠模式和工廠方法模式進行了簡單的對比,需要的朋友可以參考下
    2016-03-03
  • 從零學(xué)習(xí)cmake構(gòu)建系統(tǒng)

    從零學(xué)習(xí)cmake構(gòu)建系統(tǒng)

    這篇文章主要為大家介紹了從零學(xué)習(xí)cmake構(gòu)建系統(tǒng)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • C++中auto_ptr智能指針的用法詳解

    C++中auto_ptr智能指針的用法詳解

    這篇文章主要介紹了C++中auto_ptr智能指針的用法詳解的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • C語言中printf()緩沖問題詳解

    C語言中printf()緩沖問題詳解

    這篇文章主要給大家介紹了關(guān)于C語言中printf()緩沖問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • 淺談Qt QGraphics體系及刷新機制介紹

    淺談Qt QGraphics體系及刷新機制介紹

    這篇文章主要介紹了淺談Qt QGraphics體系及刷新機制介紹,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 基于C語言的庫封裝發(fā)布技術(shù)詳解

    基于C語言的庫封裝發(fā)布技術(shù)詳解

    在編程的過程中,使用已經(jīng)封裝好的庫函數(shù)是十分方便的,也是十分高效的,這篇文章主要給大家介紹了關(guān)于C語言庫的封裝和使用的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • C++ Boost Phoenix庫示例分析使用

    C++ Boost Phoenix庫示例分析使用

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱
    2022-11-11

最新評論

凉城县| 遵化市| 香港 | 汨罗市| 香格里拉县| 白山市| 黄陵县| 昌吉市| 来安县| 绥中县| 新丰县| 饶阳县| 云霄县| 鄯善县| 吴堡县| 图们市| 宁陕县| 安多县| 栾城县| 连平县| 永德县| 延边| 长春市| 长岭县| 洪泽县| 黑龙江省| 东辽县| 兴和县| 苗栗市| 柳河县| 香格里拉县| 渭源县| 措美县| 县级市| 宜阳县| 孟连| 咸宁市| 方山县| 会泽县| 朝阳市| 麦盖提县|