91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解決C語言中浮點數的精度丟失問題

發布時間:2022-01-16 19:20:46 來源:億速云 閱讀:2848 作者:小新 欄目:開發技術

小編給大家分享一下如何解決C語言中浮點數的精度丟失問題,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

一 先來看一段代碼

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

運行結果:

如何解決C語言中浮點數的精度丟失問題

 直接從現象說結果:精度丟失由于計算機二進制轉化過程中因為比特位過多發生數據的截斷導致的,這個結果是可以偏大也可以偏小的。

解釋一下:首先要知道二進制轉換為十進制的基本方法(除二取余法,乘五取余法等等),最好再了解一下浮點數的存儲,這里的0.1就是一個典型的例子,對0.1乘五取余是乘不盡的,那么數據轉化成的二進制序列的長度就會超出double的范圍。那么多出的數據就會被截斷。

二 如何解決

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

我在這里具體要解決的是兩個問題

(1)浮點數的大小比較

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

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

解決方案

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

如何解決C語言中浮點數的精度丟失問題

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

也就是說,任意一個比EPSILON小的值,你給一個數加上,都不會改變它的值。

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

#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;
}

上圖有兩個點

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

想象一根數軸,他們相減的絕對值就是他們的距離

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

等價于(test==1-0.9)(當然是對我們     人     而言)

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

(2)含浮點數的表達式和0.0的比較

要先把上面的搞明白。

之所以單獨說這個問題,我是想強調一個數字與零作比較到底應該是a<DBL_EPSILON還是a<=DBL_EPSILON,加強一下理解

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

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

如果看完這篇文章你還是很迷糊,但我還是想說這是不能徹底解決的(我一開始也有這種想法)

以上是“如何解決C語言中浮點數的精度丟失問題”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东源县| 山阴县| 库尔勒市| 平邑县| 梧州市| 松阳县| 珲春市| 眉山市| 安仁县| 胶南市| 乌拉特前旗| 云梦县| 呼伦贝尔市| 宁陕县| 咸丰县| 温宿县| 北票市| 张家界市| 清苑县| 德庆县| 阿坝县| 阜新市| 东山县| 利川市| 宜都市| 贵州省| 石首市| 定陶县| 潍坊市| 丰县| 西乌珠穆沁旗| 祥云县| 锦屏县| 新安县| 安泽县| 红桥区| 平凉市| 广昌县| 太谷县| 石棉县| 乌兰浩特市|