我們先直入主題,首先來看這段代碼
int main()
{
float a = 9.9;
printf("%f\n",a);
}
這段代碼正常運行是不會有問題的,但是如果你去編譯一下,會出現一個警告

這是因為,如果你想在定義一個浮點數,他的型別是會默認成double,為了讓警告消失,我們在定義一個float型別的浮點數時,在后面加上一個“f” ,告訴你滴電腦,這是個float型別的,這樣在編譯,就不會出現警告了,

然后,我們再來看這樣一段代碼
int main()
{
double a = 3.6;
printf("%.20lf\n",a);
}
如果你天真以為他會是列印3.6后面加19個0,那我為什么會特意貼上這段代碼呢?


我們中出了一個叛徒!
1:“我是誰我在哪我為什么會在這里????”
為什么會出現這種情況捏?
這種情況叫做:精度丟失(你也可以叫精度缺失)
為什么會出現這東西?
這里要說說浮點型別的存盤方式,
我們都知道,數再電腦中是以二進制存在的,比如int型別是用32個位元位存盤數字,在有符號的情況下有一個作為符號位,1代表負數,0代表正數,(不知道也當你知道)
那么浮點型是怎么存盤的??
娘的寫了半天發現越寫越多,請各位親愛的讀者自行查找資料:關鍵字“浮點型別精度丟失原因”,“浮點型在計算機中的存盤方式”,
咳咳,我們再來看這段代碼
int main()
{
double a = 1.0;
double b = 0.1;
printf("%.20lf\n",a-0.9);
printf("%.20lf\n",b);
}
這段代碼的運行結果是什么呢?

怎么可能那么簡單等于0.1?
實際上是這樣的

為什么捏,我們還是甩鍋給精度缺失叭,
那么再來看一段代碼
int main()
{
double a = 1.0;
double b = 0.1;
if (a - 0.9 == 0.1)
printf("里似豬豬\n");
else
printf("點贊關注+收藏哦\n");
}
我怎么會讓你是豬豬呢,豬豬辣么可耐
結果肯定不會那么簡單啦,結果是這樣的:

沒錯,還是精度丟失的鍋,
那我們想比較浮點型怎么辦??
我們來引入一個概念,叫誤差范圍,
既然浮點型會有精度丟失,那么我們想辦法將這個極小的誤差印象消除掉,我們可以這樣做:
自己定義一個誤差值
#define EPS 0.00000000000001 //定義一個誤差范圍
int main()
{
double a = 1.0;
double b = 0.1;
if (a - 0.9 -0.1 <= EPS && -EPS<=0.1+0.9-a )
//如果誤差小于我們定義的誤差范圍,就認為他們相等
printf("里似豬豬\n");
else
printf("點贊關注+收藏哦\n");
}

也可以這樣
#include <math.h>
#define EPS 0.00000000000001
int main()
{
double a = 1.0;
double b = 0.1;
if (fabs(a - 0.9 - 0.1) <= EPS)//fabs函式,在math.h中,為取絕對值
printf("里似豬豬\n");
else
printf("點贊關注+收藏哦\n");
}
難不成我想比較的時候,都要自己define一個數嗎?
那就用他自帶的好咯
#include <float.h>
#include <math.h>
int main()
{
double a = 1.0;
double b = 0.1;
if (fabs(a - 0.9 - 0.1) <= DBL_EPSILON)// DBL_EPSILON在float.h頭檔案中
printf("里似豬豬\n");
else
printf("點贊關注+收藏哦\n");
}

當然也是正確的,我們來看看這個DBL_EPSILON到底是何方神圣

這是一個非常小的數,由注釋我們可以知道,這個是可以令1.0+DBL_EPSILON!=1.0這個式子成立的最小值,
好啦,今天就學到這里了,告辭告辭,家里的零食說想我了!goodbye

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/290330.html
標籤:其他
