C語言中關於float、double、long double精度及數值範圍理解
IEEE754浮點數的表示方法。C語言裡對float型別資料的表示範圍為-3.4*10^38~+3.4*10^38。double為-1.7*10^-308~1.7*10^308,long double為-1.2*10^-4932~1.2*10^4932.
型別 | 位元(位)數 | 有效數字 | 數值範圍 |
float | 32 | 6~7 | -3.4*10^38~+3.4*10^38 |
double | 64 | 15~16 | -1.7*10^-308~1.7*10^308 |
long double | 128 | 18~19 | -1.2*10^-4932~1.2*10^4932 |
究竟如何計算該範圍,分析如下:
對於單精度浮點數(float)來說,符號位一位,指數位8位,尾數23位。指數能夠表示的指數範圍為-128~127。尾數為23位。
float和double的精度是由尾數的位數來決定的。浮點數在記憶體中是按科學計數法來儲存的,其整數部分始終是一個隱含著的“1”,由於它是不變的,故不能對精度造成影響。float:2^23 = 8388608,一共七位,這意味著最多能有7位有效數字,但絕對能保證的為6位,也即float的精度為6~7位有效數字;double:2^52 = 4503599627370496,一共16位,同理,double的精度為15~16位。
其中負指數決定了浮點數所能表達的絕對值最小的非零數;而正指數決定了浮點數所能表達的絕對值最大的數,也即決定了浮點數的取值範圍。float的範圍為-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的範圍為-2^1024 ~ +2^1024,也即-1.79E+308 ~+1.79E+308。
以float為例,如下表
符號 | 尾數 | 指數 |
1 | 23 | 8 |
數符(+-) | 小數部分(決定精度) | -127~128 指數(決定範圍) |
例如:
+1.1111111111111111111111*2^127(小數點後面23個1,由於尾數的範圍1~2,其最高位總為1,故只需存取小數部分,所以小數為是23位1),約等於2*2^127=3.4*10^38。為3.4*10^38負數亦然。
Double的計算與此類似,double的符號位為63位,指數為62~52位,共11位。表示的範圍為-1024~1023。尾數為51~0。表示的範圍為+1.1111111111111111..11111*2^1023(小數點後面52個1)為1.7*10^308。負數亦然。
相關文章
- c語言中%f輸出double型和float型值C語言
- 準確詳解:C/C++ float、double資料型別的表示範圍及精度C++資料型別
- C/C++中各種型別int、long、double、char表示範圍(最大最小值)C++型別
- c++ 基本資料型別(int、float、double、long、long long)最大值,最小是表示方法C++資料型別
- C/C++——求下面資料型別的最大值和最小值: char, short, int, long, float, double, long double和numeric_limits使用C++資料型別MIT
- int/double資料範圍
- 開發中遇到的float double精度問題
- C/C++_int/float/double的最大值和最小值C++
- Double型別數值相加導致精度缺失問題型別
- 關於MYSQL中FLOAT和DOUBLE型別的儲存MySql型別
- Java面試官:兄弟,你確定double精度比float低嗎?Java面試
- int float double 各型別的最大值最小值型別
- C++讀二進位制檔案 及 C++設定double精度C++
- Java深海拾遺系列(5)--- 精度計算中的BigDecimal,double和floatJavaDecimal
- float和double有什麼區別?
- java double、float型別的比較Java型別
- Double BigDecimal 精度丟失總結Decimal
- Java浮點數float,bigdecimal和double精確計算的精度誤差問題總結JavaDecimal
- 關於java中的double check lockJava
- oracle plsql(一)_binary_float_binary_doubleOracleSQL
- decimal,float和double的區別是什麼?Decimal
- Double型別精度問題引起的錯誤型別
- C語言 int,float,double整型和浮點型資料在相互運算時bug原因C語言
- MySQL的Double Write並不難理解MySql
- MySQL 字串轉double轉換棧幀(可能丟失精度)MySql字串
- c語言中返回整數值的長度C語言
- C++11獲取double型別的最大最小值C++型別
- PyTorch出現錯誤“RuntimeError: Found dtype Double but expected Float”PyTorchError
- C/C++ 恨透了 double free or corruptionC++
- MySQL double writeMySql
- double 函式函式
- Python 四種數值型別(int,long,float,complex)區別及轉換Python型別
- c# (int)double顯式轉化C#
- Java:利用BigDecimal類巧妙處理Double型別精度丟失JavaDecimal型別
- GAT專案-保險模組費用Double型別相加損失精度型別
- mybatis sql String>Double, 型別引數被強轉為數值型別MyBatisSQL型別
- Java 浮點數精確性探討(IEEE754 / double / float)與 BigDecimal 解決方案JavaDecimal
- 修復 PHP7.1、7.2beta 中 JSON_encode () 處理 float/double 型數值時溢位的問題PHPJSON