C要點5:float、double、long double(大小,範圍,輸入輸出符,科學計數法)

2021-02-20 C3程序猿

浮點型:數學裡的小數

C語言浮點型有三個類型:float、double、long double

輸入輸出輸出格式符: 默認輸出6位小數

float--%f

    double、long double--%lf   不初始化不行

    %e  科學記數法,形式如:2.23e2其中e--10

float

內存大小:4位元組,由sizeof(float)獲取

表示範圍:-2^128 ~ +2^128,也即約-3.40282e+38 ~ +3.40e+38

         這些數不用記,大家就知道範圍超級大就行了

標準規定:float指數範圍不小於-37~38,e是10,所以有的環境下,精度會高一些

默認範圍:頭文件 float.h宏 FLT_MIN

有效數位:float也叫單精度浮點型

ANSI C規定最小值是6,有的編譯器可能8位,可能7位

          注意不是小數的位數,是以第一個非0數字開始數6位

          比如:12345.6789,6位精度位指的是12345.6,後面得789就是非精度位,也就是不要考慮了,789將會是不精確存儲。

  0.00012456789,6位精度位指的是123456,789就不用考慮是否準確了

double

內存大小:8位元組,由sizeof(double)獲取

表示範圍:-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308

標準規定:double指數範圍不小於-37~38,實際實現-307~308

有效數位:double又叫雙精度浮點型

         ANSI C規定最小值是10位, 多數編譯器是15,16,17位左右

         大家測一下自己的編譯器就行了,不必記

 

long double

內存大小:規定不小於double的長度,至少8位元組,不同的編譯器這個字節數可能不同,有的是8,有的是10,有的是12,有的甚至更大。那麼這個字節數就以自己使用的編譯器為準,測一下,知道有這個區別。

表示範圍:那這個就依據大家自己的測試,字節數越大,精度就越大

          Visual Studio裡long double跟double是一樣8位元組

          大家有測試gcc的,是12位元組

有效數位:ANSI C規定最小值是10位,實際中依據環境具體實現,vs測是18位

 

後綴:

後綴:  L /l  0.2l/0.2L   long double數據

無後綴:      0.2         double數據

後綴:  F/f   0.2F/0.2f   float數據

問題:如果不是對應的,會涉及到類型轉換,類型轉換的結果可能會造成內存截斷,導致數據不是我們想要的,所以需要儘量保持一致

為啥要轉換:只有數值類型一樣了,計算機才能進行計算,不一樣就轉成一樣的

 

輸入輸出

printf輸出浮點型

%f,%lf這兩個都行,輸出沒有嚴格要求,默認是6位小數,第六位四捨五入

%5.2f  或者lf

    5代表整個數佔據屏幕多少個字符位,多了有效果,少了無效果

. 表示小數點

    2表示小數的位數,第二位是四捨五入

%e 科學記數法。123.34輸出1.233400e+02

默認6位小數,也可控制%.4e,就輸出1.2334e+02

e是10,

+02是正2次方

輸出這塊格式有很多種,大家不必花太多時間,書上有的試一下就行

 

scanf輸入浮點型

float        %f

double      %lf

long double  %lf

輸入浮點型,格式符一定要跟類型對應上,否則就出錯

 

浮點型的存儲

float:1bit(符號位) 8bits(指數位) 23bits(尾數位)

    最高位是符號位:1代表負數,0代表正數

    指數位:-2^7~2^7-1  -128~127

    有效數位(尾數位):2^23  8388608  7位

double:1bit(符號位) 11bits(指數位) 52bits(尾數位)

    最高位是符號位:1代表負數,0代表正數

    指數位:-2^10~2^10-1  -1024~1023

    有效數位(尾數位):2^52  4503599627370496  16位

 

選擇使用

 大家根據自己的需求:float(4位元組,6精度)、double(8位元組,最少10精度,一般都是實現15精度) 常用,long double一般用的不是很多,因為我們不需要那麼高的精度。科學計算一般精度要求非常高,會涉及到精度,應用開發一般用不到,大家用到的時候會選擇就行了,問題不大。

相關焦點

  • float和double有什麼區別?
    所以還是總結一下:float 單精度浮點數在機內佔 4 個字節,用 32 位二進位描述。double 雙精度浮點數在機內佔 8 個字節,用 64 位二進位描述。浮點數在機內用指數型式表示,分解為:數符,尾數,指數符,指數四部分。數符佔 1 位二進位,表示數的正負。指數符佔 1 位二進位,表示指數的正負。
  • c語言基本數據類型short、int、long、char、float、double
    C 語言包含的數據類型如下圖所示:一、數據類型與「模子」short、int、long、char、float、
  • C語言|格式控制(int、double等的輸入輸出格式與進位轉換)
    數據可以分為整形數據和實型數據,整形數據有int、long、unsigned、unsigned long,實型數據有float、double。其中整形數據在輸出時可以輸出其十進位、八進位、十六進位形式。1.
  • java float double精度為什麼會丟失?淺談java的浮點數精度問題
    問題大概情況可以通過如下代碼理解:得到的結果如下:f=2.0015E7d=2.0015E7d2=2.0014999E7從輸出結果可以看出double 可以正確的表示20014999 ,而float 沒有辦法表示20014999 ,得到的只是一個近似值。這樣的結果很讓人訝異。
  • 變量專題之二:double,float和浮點變量底層表示
    double d = 1.1;還有另外一種浮點數變量 float (單精度浮點數),佔 32 bits,使用的場景比較少。和long類型類似,所有在Java原始碼字面上中出現的小數默認為double類型,float類型的字面量必須以f結尾。
  • 詳解C語言數據類型:float與double
    當較小尺寸的參數(特別是char,short和float)傳遞給可變參數函數(如printf之類的函數,其參數數量不固定)時,它們將轉換為較大尺寸。Char和short轉換為int,float轉換為double。為什麼這樣 據我所知,純粹出於歷史原因。
  • C語言-輸入與輸出函數
    眾所周知,C語言需要輸入和輸出,那麼今天小編我就帶領大家去學習這個編程必不可少的輸入和輸出函數。一,首先我們先來學習輸出函數(printf)其意義是:按指定的格式輸出值。因此,函數在括號中的參數都由以下兩部分組成:1、 格式控制串:格式控制串是一個字符串,必須用雙引號括起來,它表示了輸入輸出量的數據類型。在printf函數中可以在格式控制串內出現非格式控制字符,這時在顯示屏幕上會顯示源字符串。2、參數表:參數表中給出了輸出的變量。當有多個變量時,用英文逗號(,)分開。
  • C 語言學習之變量、數據類型
    在輸出時,各個佔位符的說明。存儲大小值範圍char/signed char使用細節一般使用過程中,都是用 double 類型,因為它的精度比 float 更精確printf("%f",d1); 輸出時,默認保留小數點後
  • MySQL資料庫中float、double、decimal三個浮點類型到底有什麼區別?
    首先我們先來了解一下每個浮點類型的存儲大小和範圍,如下表:| 類型       | 大小                                     | 範圍(有符號)                                               | 範圍(無符號)
  • 「踩坑系列」使用long類型處理金額,科學計數法導致金額轉大寫異常
    相信大家對這個異常都不陌生,很顯然,是因為將字符串轉換為數字時拋出的,比如下面這樣:但仔細查看了用戶報錯的單據,也沒有發現哪裡有輸入「E」這樣的字符串(請原諒我第一時間沒有想到是科學計數法造成的,哈哈),最後把生產環境的這條數據插入到了開發環境中,定位到原來是因為將金額轉換為大寫時導致的,報錯的關鍵代碼如下所示:
  • C /C++知識要點總結
    C C++知識要點總結.png一、 數據類型及運算求補碼原碼的基礎上, 符號位不變, 其餘各位取反, 最後+1原碼轉補碼不考慮符號位補碼轉原碼,符號位不參與運算取反後 + 1 == 取反前 - 1科學計數法表示1.8 * 10^11 --> 1.8E119.34 * 10^-3 --> 9.34E-3相關細節
  • C/C++基礎之sizeof使用
    不支持鏈式表達式,sizeof 作用域範圍內的語句不會編譯成機器碼,如 sizeof(num++) 中的 ++ 不執行。、float、double這樣的簡單內置數據類型。 int : " << sizeof(long int) << endl;   cout << "Size of float : " << sizeof(float) << endl;   cout << "Size of double : " << sizeof(double) << endl
  • C語言簡明教程(二)數據類型
    接下來,我們依託這個程序講解幾個知識點,之後再做分析。格式輸出函數 printf()一般形式:printf(格式控制,輸出表列)。長整型(long 類型)gcc 編譯系統分配給 long 類型 8 個字節,存儲方式和 int 類型一樣,也是補碼的形式存儲,取值範圍是 -2^63 到(2^63-1),無符號長整型 unsigned long 的取值範圍是 0 到(2^64-1)。不同類型佔用的空間在這裡大家可以通過 sizeof() 運算符查看各類型的常量佔據多少字節。
  • C語言初學者常見問題與錯誤
    解決方案:把b定義為長整型long,即long b = 1;(其實這裡還涉及到隱式轉換,所以,更為正確的方法是把a也定義為長整型) 7、C語言中的「除法」 例如: #include int main(void) { printf("請輸入一個華氏溫度"); float a,c; scanf("%f
  • C語言丨入門筆記-3(含計算機英語)
    > <float.h> 頭文件僅定義了一些與浮點數特性有關的宏。 <float.h> 頭文件對 float、double 和 long double三種類型的浮點數進行了說明,並且宏的命名也非常規範,以FLT_開頭的表示宏用來描述 float 類型的特性,以DBL_開頭的表示宏用來描述 double 類型的特性,以LDBL_開頭的表示宏用來描述 long double 類型的特性。
  • 《C語言入門指南》上篇
    浮點型下表列出了關於標準浮點類型的存儲大小、值範圍和精度的細節:類型存儲大小值範圍精度float 單精度4 字節1.2E-38 到 3.4E+386 位小數double 雙精度= 1.1; //「初始化」: 從「double」到「float」截斷 //float num1 = 1.1f;// 1.1f就是float //double num3 = 1.3; // ok //double d4 = 5.12 double num5 = .512;// 等價於0.512 double num6 = 5.12e2;// 等價於5.12*
  • java類型轉換String互轉int,double, float, BigDecimal
    >String 轉 int ,double, float, BigDecimalString轉intString str = "123";float d= Float.parseFloat(str)float轉String float d=1.2f;DecimalFormat df = new DecimalFormat("#########.#");
  • C語言常用標準庫
    通常有下面定義:#define getchar() getc(stdin)#define putchar(c) putc(c, stdout)int ungetc(int c, FILE* stream); 格式化輸入輸出:int scanf(const char *format, ...)
  • C語言常用標準庫解讀
    通常有下面定義:#define getchar() getc(stdin)#define putchar(c) putc(c, stdout)int ungetc(int c, FILE* stream); 格式化輸入輸出:int scanf(const char *format, ...)
  • C語言丨入門筆記-2(含計算機英語)
    %.2f中的.2用於精確控制輸出,指定輸出的浮點數隻顯示小數點後面兩位。C語言中採用float和double關鍵字來定義小數,float稱為單精度浮點型,double稱為雙精度浮點型,long double更長的雙精度浮點型。一個float變量佔用四字節,一個double類型變量,一般佔用8位元組。