欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言中浮點(diǎn)數(shù)的精度丟失問題解決

 更新時(shí)間:2022年01月12日 11:31:39   作者:anewboya  
大家好,本篇文章主要講的是C語言中浮點(diǎn)數(shù)的精度丟失問題解決,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽

一 先來看一段代碼

#include<stdio.h>
int main()
{
    double test=0.1;
    printf("%.100lf",test);
    return 0;
}

運(yùn)行結(jié)果:

 直接從現(xiàn)象說結(jié)果:精度丟失由于計(jì)算機(jī)二進(jìn)制轉(zhuǎn)化過程中因?yàn)楸忍匚贿^多發(fā)生數(shù)據(jù)的截?cái)鄬?dǎo)致的,這個(gè)結(jié)果是可以偏大也可以偏小的。

解釋一下:首先要知道二進(jìn)制轉(zhuǎn)換為十進(jìn)制的基本方法(除二取余法,乘五取余法等等),最好再了解一下浮點(diǎn)數(shù)的存儲(chǔ),這里的0.1就是一個(gè)典型的例子,對(duì)0.1乘五取余是乘不盡的,那么數(shù)據(jù)轉(zhuǎn)化成的二進(jìn)制序列的長(zhǎng)度就會(huì)超出double的范圍。那么多出的數(shù)據(jù)就會(huì)被截?cái)唷?/p>

二 如何解決

如果你想的是徹底讓屏幕顯示出來的是0.1,那么,你不孤單,我一開始也是這樣想的,但是這是不可能的。但是這個(gè)對(duì)我們的實(shí)際意義不大,畢竟有效的區(qū)段還是夠的。

我在這里具體要解決的是兩個(gè)問題

(1)浮點(diǎn)數(shù)的大小比較

#include<stdio.h>
int main()
{
    double test=0.1;
    if(test==(1-0.9))
    {
        printf("正常");
    }
    else
    {
        printf("what!!!");
    }
    return 0;
}

這段代碼會(huì)輸出“what!”。為什么上面已經(jīng)說了0.1乘不盡,這里換成0.5是OK的,因?yàn)?.5D用二進(jìn)制表示就是0.1B。每次都考慮乘不盡不煩嗎?

解決方案

引入庫函數(shù)<float.h>里定義的宏DBL_EPSILON。

 這里后面的一段英文是他是導(dǎo)致x+n!=x的最小值  (n代表EPSILON伊普西隆,x是任意值)

也就是說,任意一個(gè)比EPSILON小的值,你給一個(gè)數(shù)加上,都不會(huì)改變它的值。

那么,比EPSILON小的值引起的精度丟失都是在我們的允許范圍內(nèi)的

#include<stdio.h>
#include<float.h>
#include<math.h>
int main()
{
    double test = 0.1;
    if (fabs(test - (1 - 0.9)) < DBL_EPSILON)
    {
        printf("正常");
    }
    else
    {
        printf("what!!!");
    }
    return 0;
}

上圖有兩個(gè)點(diǎn)

1 。在<math.h>下的fabs(a)即取a的絕對(duì)值

想象一根數(shù)軸,他們相減的絕對(duì)值就是他們的距離

2 。 if(fabs(test-(1-0.9)<DBL_EPSILON))

等價(jià)于(test==1-0.9)(當(dāng)然是對(duì)我們     人     而言)

test和(1-0.9)的距離若是小于DBL_EPSILON,那么精度的丟失是在可控范圍內(nèi)的,說明他們倆相等

(2)含浮點(diǎn)數(shù)的表達(dá)式和0.0的比較

要先把上面的搞明白。

之所以單獨(dú)說這個(gè)問題,我是想強(qiáng)調(diào)一個(gè)數(shù)字與零作比較到底應(yīng)該是a<DBL_EPSILON還是a<=DBL_EPSILON,加強(qiáng)一下理解

EPSILON是允許范圍內(nèi)的最小值(回到宏定義后面的解釋),所以這個(gè)等于不可以加,加了說明上面的a如果等于EPSILION時(shí),會(huì)導(dǎo)致數(shù)值的改變。

想要徹底解決精度丟失,是不可能的,也沒必要,但我們有辦法用近似來解決。

如果看完這篇文章你還是很迷糊,但我還是想說這是不能徹底解決的(我一開始也有這種想法),那么希望下次我準(zhǔn)備出的數(shù)據(jù)的存取能對(duì)你有幫助。篇幅太長(zhǎng)了,所以刪刪減減還是準(zhǔn)備放到下次。

總結(jié)

到此這篇關(guān)于C語言中浮點(diǎn)數(shù)的精度丟失問題解決的文章就介紹到這了,更多相關(guān)C語言浮點(diǎn)數(shù)精度丟失內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言繪制雷達(dá)圖的示例代碼

    C語言繪制雷達(dá)圖的示例代碼

    常用的統(tǒng)計(jì)圖有條形圖、柱形圖、折線圖、曲線圖、餅圖、環(huán)形圖、扇形圖,其中還有一種雷達(dá)圖的繪制也較難,本文為大家提供了雷達(dá)圖的繪制方法,需要的可以參考下
    2024-02-02
  • 詳解C++語言中的加法運(yùn)算符與賦值運(yùn)算符的用法

    詳解C++語言中的加法運(yùn)算符與賦值運(yùn)算符的用法

    這篇文章主要介紹了C++語言中的加法運(yùn)算符與賦值運(yùn)算符的用法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-01-01
  • C++利用類實(shí)現(xiàn)矩陣的數(shù)乘,乘法以及點(diǎn)乘

    C++利用類實(shí)現(xiàn)矩陣的數(shù)乘,乘法以及點(diǎn)乘

    這篇文章主要為大家詳細(xì)介紹了C++如何利用類實(shí)現(xiàn)矩陣的數(shù)乘,乘法以及點(diǎn)乘,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定幫助,需要的可以參考一下
    2022-11-11
  • C++使用UDP通訊的實(shí)現(xiàn)示例

    C++使用UDP通訊的實(shí)現(xiàn)示例

    本文實(shí)現(xiàn)對(duì)C++使用UDP做了簡(jiǎn)單封裝,實(shí)現(xiàn)通訊,包括服務(wù)端和客戶端,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • 深入探究C語言中的二叉樹

    深入探究C語言中的二叉樹

    樹是一種非線性的數(shù)據(jù)結(jié)構(gòu),它是由n(n>=0)個(gè)有限結(jié)點(diǎn)組成一個(gè)具有層次關(guān)系的集合。把它叫做樹是因 為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。本文將帶你深入探究C語言中的二叉樹,感興趣的同學(xué)跟著小編一起學(xué)習(xí)吧
    2023-05-05
  • C++begin和end運(yùn)算符的返回迭代器的類型如何判斷?

    C++begin和end運(yùn)算符的返回迭代器的類型如何判斷?

    今天小編就為大家分享一篇關(guān)于C++begin和end運(yùn)算符的返回迭代器的類型如何判斷?,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • MFC實(shí)現(xiàn)連連看游戲之地圖顯示

    MFC實(shí)現(xiàn)連連看游戲之地圖顯示

    這篇文章主要為大家詳細(xì)介紹了MFC實(shí)現(xiàn)連連看游戲之地圖顯示,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • QT實(shí)現(xiàn)簡(jiǎn)單音樂播放器

    QT實(shí)現(xiàn)簡(jiǎn)單音樂播放器

    這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)簡(jiǎn)單的音樂播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C++實(shí)現(xiàn)讀寫ini配置文件的示例代碼

    C++實(shí)現(xiàn)讀寫ini配置文件的示例代碼

    配置文件的讀取是每個(gè)程序必備的功能,配置文件的格式多種多樣,例如:ini格式、json格式、xml格式等。其中屬ini格式最為簡(jiǎn)單,且應(yīng)用廣泛。本文和大家分享了C++讀寫ini配置文件的方法,需要的可以參考一下
    2023-05-05
  • 教你分辨C++堆與棧的區(qū)別

    教你分辨C++堆與棧的區(qū)別

    堆與棧的區(qū)別有:1、棧由系統(tǒng)自動(dòng)分配,而堆是人為申請(qǐng)開辟;2、棧獲得的空間較小,而堆獲得的空間較大;3、棧由系統(tǒng)自動(dòng)分配,速度較快,而堆一般速度比較慢;4、棧是連續(xù)的空間,而堆是不連續(xù)的空間
    2021-06-06

最新評(píng)論