C語言深入探索浮點數(shù)的使用秘密
一、內存中的浮點數(shù)
浮點數(shù)在內存的存儲方式為:符號位,指數(shù),尾數(shù)
類型 | 符號位 | 指數(shù) | 尾數(shù) |
float | 1位(第31位) | 8位(第23--30位) | 23位(第0--22位) |
double | 1位(第63位) | 11位(第52--62位) | 52位(第0--51位) |
注:float 與 double 類型的數(shù)據(jù)在計算機內部的表示法是相同的,但由于所占存儲空間的不同,其分別能夠表示的數(shù)值范圍和精度不同。
二、浮點數(shù)存儲實例
浮點數(shù)的轉換
- 將浮點數(shù)轉換成二進制
- 用科學計數(shù)法表示二進制浮點數(shù)
- 計算指數(shù)偏移后的值
注意:計算指數(shù)時需要加上偏移量,而偏移量的值與類型有關。
示例:對于指數(shù)6,偏移后的值如下:
float:127 + 6 -> 133
double:1023 + 6-> 1029
實數(shù) 8.25 的在內存中的 float 表示
8.25的二進制表示:1000.01 -> 1.00001 * (2 ^ 3)
- 符號位:0
- 指數(shù):127 + 3 -> 130 10000010
- 小數(shù):00001
內存中 8.25 的 float 表示:
- 0 10000010 00001000000000000000000 -> 0x41040000
下面看一下 8.25 是不是在內存中表示為 0x41040000 吧:
#include <stdio.h> int main() { float f = 8.25; unsigned int* p = (unsigned int*)&f; printf("0x%08X\n", *p); return 0; }
下面為輸出結果:
三、浮點類型的秘密
首先看一下 int 類型和 float 類型的范圍:
int 類型的范圍:[-2 ^ 31,2 ^ 31 - 1]
float 類型的范圍:[-3.4 * 10 ^ 38,3.4 * 10 ^ 38]
這就出現(xiàn)一個問題:int 和 float 都占4個字節(jié)的內存,為什么 float 卻比 int 的范圍大得多呢?
解釋如下:
- float 能表示的具體數(shù)字的個數(shù)與 int 相同
- float 可表示的數(shù)字之間不是連續(xù)的,存在間隙
- float 只是一種近似的表示法,不能作為精確數(shù)使用
- 由于內存表示法相對復雜,float 的運算速度比 int 慢得多
注意:double 與 float 具有相同的內存表示法,因此 double 也是不精確的。由于 double 占用的內存較多,所能表示的精度比 float 高。
下面看一段 float 類型的不精確示例代碼:
#include <stdio.h> int main() { float f = 3.1415f; float fl = 123456789; printf("%0.10f\n", f); printf("%0.10f\n", fl); return 0; }
下面為輸出結果:
這個示例就是表示 f 和 fl 小數(shù)點的后 10 位,結果表明,float 只是一種近似的表示法,不能作為精確數(shù)使用以及float 可表示的數(shù)字之間不是連續(xù)的,存在間隙。
四、小結
- 浮點類型與整數(shù)類型的內存表示法不同
- 浮點類型的內存表示更復雜
- 浮點類型可表示的范圍更大
- 浮點類型是一種不精確的類型
- 浮點類型的運算速度較慢
到此這篇關于C語言深入探索浮點數(shù)的使用秘密的文章就介紹到這了,更多相關C語言浮點數(shù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++中set/multiset容器詳解(附測試用例與結果圖)
set/multiset屬于關聯(lián)式容器,底層結構是用二叉樹實現(xiàn),下面這篇文章主要給大家介紹了關于C++中set/multiset容器的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-02-02VC6.0代碼自動提示 VC6.0在win7環(huán)境下代碼提示智能化
作為程序猿的你,是否已經喜歡或習慣依賴IDE開發(fā)環(huán)境呢,有了IDE環(huán)境,即使你想不起方法全名,只要知道某個前綴,或哪怕在提示列表中,一一查詢,也可以找到自己想找的方法或屬性2013-01-01基于C語言編寫簡易的英文統(tǒng)計和加密系統(tǒng)
這篇文章主要介紹如何基于C語言編寫一個簡易的英文統(tǒng)計和加密系統(tǒng),實際上就是對字符數(shù)組的基本操作的各種使用,感興趣的可以了解一下2023-05-05