成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析 Easy C++,C++ 浮點數類型

開發 后端
浮點數是C++的第二組基本類型,它能夠表示帶小數部分的數字。不僅如此,浮點數的范圍也比int更大,可以表示更大范圍的數字。

[[429800]]

浮點數

浮點數是C++的第二組基本類型,它能夠表示帶小數部分的數字。不僅如此,浮點數的范圍也比int更大,可以表示更大范圍的數字。

我們都知道在計算機當中,所有數據本質上都是轉化成二進制存儲的。整數很簡單,存儲的就是轉化成二進制之后的01串,那么浮點數又是如何存儲的呢?

很容易猜到的是浮點數存儲的結果也是二進制,但相比于整型直接轉化成二進制要復雜一些。它需要先表示成下面這行式子:

這里的n即我們要存儲的浮點數,s表示符號位,m是尾數,而e則是階數。

符號位很好理解,它和整型當中的符號位一樣,0表示正數,1表示負數。m表示尾數,。我們這么看很抽象,來看一個例子,比如3.0,轉化成二進制是,相當于。那么,。

我們了解了浮點數的表示方式,那么它又是如何存儲在計算機當中的呢?這需要我們進一步地剖析其中的細節。

關于m

首先是m,m被定義成一個大于等于1,小于2的小數。我們可以簡單寫成1.xx,其中xx表示的就是小數的部分。

既然它總是大于等于1,小于2的,那么它的個位一定是1,我們就可以將它省略,僅僅看之后小數的部分。小數的部分,我們同樣使用二進制來逼近。比如0.625,可以表示成0.5 + 0.125,即,表示成二進制就是,只不過這里它的最高位是從-1開始的。

以32位的浮點數為例,除去1位表示符號,8位表示階數之后,還有23位留給m。由于我們舍掉了小數點之前的1,所以我們的階數是從-1開始的,理論上等價于24個二進制位。

關于e

在浮點數存儲當中,e是一個無符號整數。以32位浮點數為例,e一共有8位,可以表示0-255。

但e是可以為負數的,根據IEEE 754的規定,e的真實值必須再減去一個中間數。對于8位的e,它的中間數是127。比如e的實際值是10,但是存儲的時候需要存儲成127+10=137。

除此之外,e還有另外三種情況:

  • e不全為0,或全為1時,采用上述的規則表示
  • e全為0時,e等于1-127,有效數字m不再默認加上1,這樣是為了還原0.xxx的小數,以及接近于0的數
  • e全為1時,如果有效數字m全為0,表示無窮大,如果m不全為0,表示nan(not a number)

關于e的規則看起來有些復雜,初看覺得有些難以理解,為什么要用減去中間值的設計,而不用符號位?后來仔細思考了一下才發現,如果引入符號位很難區分0.xxx以及e就是等于0的情況,雖然也可以特判處理,但就沒有現在這樣優雅了。

覺得上文看不懂的小伙伴可以直接略過這段,畢竟這個是浮點數的實現原理,算是很底層的內容了,C++ primer上對于這部分也沒有過多闡述。

浮點數的使用

C++當中有兩種浮點數的書寫方式,第一種是使用常規的小數點表示法:

  1. double a = 1.23; 
  2. float b = 3.43; 

另外一種寫法是科學記數法,寫成:

  1. double a = 2.45e8; 
  2. double b = 1e-7; 

2.45e8表示,e之后可以跟正數也可以跟負數,但數字當中不能有空格。

浮點數類型

和C語言一樣,C++也有三種浮點數類型:float,double和long double。和整型一樣,這三種類型都是浮點數,只不過表示的范圍不同。

浮點數的范圍有兩個部分綜合決定,一個部分是有效數字。比如14179是5位有效數字,而14000只有兩位,因為后面三個0都是填充位,有效數字的位數不依賴小數點的位置。C++當中要求,float至少表示32位有效數字,double至少48位,而long double至少和double一樣。

另外,它們能夠表達的指數范圍至少是-37到37。一般來說,float一共是4個字節32位,而double是8個字節64位,當然這也取決于具體的運行環境。

注意事項

關于浮點數的使用有幾點注意事項,千萬要注意。

cout輸出浮點數會刪除結尾的0

書寫浮點數常量時默認為double類型,如果需要強制表示為float類型,請在結尾加上后綴f或者F,如:2.34f

由于浮點數有精度,不能直接判斷兩個浮點數是否相等,很有可能得不到預期結果,正確的做法是判斷精度范圍,如:

  1. double epsilon = 1e-8; 
  2. // 判斷a是否和b相等 
  3. if (abs(a - b) < epsilon) { 
  4.     // todo 

判斷兩個浮點數a和b是否相等,等價于兩者的差的絕對值小于某一個精度。

范圍問題,如運行下列代碼將得到錯誤的結果:

  1. float a = 2.3e22f; 
  2. float b = a + 1.0f; 
  3.  
  4. cout << b - a << endl; 

輸出的結果將是0,因為2.3e22是一個小數點左邊有23位的數字,加上1之后,就是在第23位加上1。但是float類型只能表示數字中的前6位或者前7位,表示不了這么高的精度,因此這個+1的操作完全沒有生效。 

這個問題是一個大坑,一不小心就會中招,千萬要小心。

本文轉載自微信公眾號「Coder梁」,可以通過以下二維碼關注。轉載本文請聯系Coder梁公眾號。

 

責任編輯:武曉燕 來源: Coder梁
相關推薦

2010-01-15 15:21:35

C++

2010-01-21 09:34:57

C++語法

2010-01-27 16:05:06

C++堆棧

2010-01-25 10:41:59

C++數據類型

2010-01-20 10:19:55

C++數組

2010-01-27 17:16:52

C++構造函數

2010-01-27 10:53:55

C++數據類型

2010-01-26 14:35:11

C++關鍵字

2010-01-28 13:45:06

C++數組

2010-01-28 16:31:54

C++類型

2010-01-14 17:13:53

C++接口

2010-01-21 16:18:06

C++語言

2010-01-25 14:18:46

C++對象模型

2010-02-06 17:39:52

C++ strtok

2010-01-21 13:48:30

C++基類

2010-01-27 15:46:15

學習C++效率

2010-01-26 14:10:22

Visual C++

2010-01-21 14:28:03

C++靜態成員函數

2010-01-27 15:05:04

C++標準化

2010-01-20 09:54:27

C++數據類型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 视频一区中文字幕 | 国产一区二区久久 | 欧美不卡一区二区 | 国产精品毛片无码 | 在线免费观看a级片 | 风间由美一区二区三区在线观看 | 欧美日韩网站 | 日韩欧美在线播放 | 国产免费一区二区三区 | 91麻豆精品国产91久久久久久 | 国产免费观看一级国产 | 精品久久精品 | 国产精品成人久久久久 | 91麻豆精品一区二区三区 | 日日操日日干 | www.日日操| 久久久久久成人 | 午夜精品在线观看 | www.欧美视频 | 亚洲精品18 | 久久精品视频一区二区三区 | 天天干天天想 | 中文字幕国产在线 | 国产精品综合一区二区 | 久久久爽爽爽美女图片 | av网站在线看| 亚洲精色| 九九热免费看 | 妞干网福利视频 | 麻豆亚洲 | 成人片免费看 | 91在线看| 天天av综合| 欧美日本韩国一区二区 | 欧美二区三区 | 福利一区视频 | 羞羞视频免费在线 | 天天精品在线 | 国产精品美女www爽爽爽 | 国产精品视频免费观看 | 欧美日韩一区在线观看 |