回覆列表
  • 1 # 涯無止境

    首先浮點型資料是用來表示具有小數點的實數的,凡以小數形式或指數形式出現的實數均是浮點型常量,浮點型資料包括float(單精度浮點型)、double(雙精度浮點型)、long double(長雙精度浮點型)。

    float型(單精度浮點型)。編譯系統為每一個float型變數分配四個位元組,能得到六位有效數字。

    double型(雙精度浮點型)。編譯系統為每一個double型變數分配八個位元組,能得到十五位有效數字。

    long double型(長雙精度)型。不同的編譯系統對其處理不一樣,Turbo C對其分配十六個位元組,Visual C++則對其分配八個位元組。

    注意:

    C編譯系統把浮點型常量都按雙精度處理,分配八個位元組。

    在C語言中進行浮點數的算數運算時,將float型資料都自動轉換為double型,然後進行運算。

  • 2 # IT劉小虎

    在C語言程式開發中,有時浮點運算是不可避免的,遺憾的是,由於計算機的精度是有限的,所以很多時候C語言程式並不總是能夠精確的儲存和處理浮點數,這也是很多C語言程式盡力使用整型運算代替浮點運算的原因之一。

    計算機儲存浮點數的方式與儲存整數的方式有所不同,遇到很長的浮點數時,總不能採用無限制長度的空間儲存吧?事實上,對於計算機中浮點數的儲存,國際上制定過一些標準。這一點可參考我之前的文章。

    定義 float 變數賦值為 3.1,為什麼使用 printf 打印出來的是 3.0999999?

    其實並不總是如此。很多計算機使用二進位制表示整數,也使用二進位制表示浮點數。我們人類常用十進位制表示數字,遺憾的是,十進位制能夠精確表示的數字,並不一定也能使用二進位制表示精確。

    例如在十進位制中,分數 1/3 = 0.33333…無數個3,十進位制是無法精確表示這一數字的。同樣的道理,0.1 也即 1/10 在二進位制中也是無法精確表示的(0.0001100110011…),所以在這種情況下,3.1 也就無法精確表示了,而只能使用 3.0999999 去近似。

    使用 printf() 函式列印 3.1,最終顯示到終端的結果主要取決於所使用計算機中二/十進位制的轉換仔細程度。實際上,有時我們將一個精確的十進位制浮點數轉換為二進位制,然後再轉換回十進位制,會發現前後兩個數字並不“相等”。

    為什麼 sqrt(144.) 得不到正確結果?

    小明希望使用C語言math庫的 sqrt() 函式計算 144 的平方根,於是他寫出下面這樣的C語言程式碼,請看:

    但是小明編譯這段C語言程式碼並執行後,發現程式輸出的是一串雜數,這是怎麼回事呢?

    仔細觀察小明的C語言程式碼,能夠發現他雖然呼叫了 math 庫中的函式,但是卻並沒有包含相應的標頭檔案“math.h”,這造成的後果是C語言編譯器無法確定 sqrt() 函式的原型。此時,編譯器只好“猜測”sqrt() 的函式原型為:

    也即編譯器認為 sqrt() 函式的返回值為一個整數。如果讀者看了我之前的文章,應該明白計算機儲存整數和浮點數的方式是不同的,因此C語言程式以浮點數的儲存方式解釋整數時,自然是有可能出現不預期的結果的。

    如果C語言編譯器處理函式時未發現其原型,一般都會將 int f(); 當作該函式原型。

    如何判斷兩個浮點數“相等”?

    計算機無法精確表示浮點數,這個特性也影響了C語言程式判斷兩個浮點數是否相等,如果讀者看過我之前的文章,應該清楚在C語言程式中,== 運算子是不能用於判斷兩個浮點數是否相等的。

    事實上,鑑於C語言程式無法總是準確表示浮點數,在需要判斷兩個浮點數是否“相等”時,通常的做法是判斷這兩個數是否足夠“接近”:

    其中 epsilon 是一個非常小的整數,上述表示式將浮點數 a,b足夠接近近似為“相等”。雖說 epsilon 應該在浮點數表示範圍內足夠小,但是實際開發中,只要能夠滿足實際需要的精度就可以了,“夠用就行”。因此,epsilon 也可以是程式設計師自行設定的閾值。

    如何賦值一些特殊值,如 NaN(not a number,不是數字)?

    許多平臺都提供了方便處理浮點數值的工具或者函式,比如一些預定義的常數,以及類似 isnan() 的函式,這些工具要麼作為 <math.h> 中的標準擴充套件,要麼作為 <ieee.h> 或 <nan.h> 的非標準擴充套件。

    一般來說,如果某個數字不與自己相等,那麼這個數必定是 NaN:

    不過,應該注意的是,為遵守 IEEE 的C語言編譯器可能會對這樣的對比程式碼最佳化。還要注意,即使系統中對 NaN 這樣的特殊數字做了預定義,我們也不能將其與其他數字對比,例如 if(x==NaN) 就是不合適的程式碼,因為 NaN 不能與數字做比較。

    如果開發C語言程式的平臺沒有直接提供類似於 NaN 這樣的特殊數字,我們可以自行定義它們,例如:

    不過應該明白的是,有些編譯器會將上述兩行C語言程式碼當作“浮點異常”處理,此時我們將不能得到 nan 和 inf。

    對於 NaN 和 inf,還有一點需要清楚的是 sprintf() 函式的格式輸出,在有些平臺,它能產生類似於“NaN”以及“inf”的字串。

    小結

    本節主要介紹了C語言程式開發中,處理浮點數時應注意的事項。因為計算機無法總是精確儲存浮點數,所以處理浮點數和處理整數是有所區別的,如果不清楚這些,很容易寫出有問題的程式碼。這裡強烈推薦大家閱讀我之前的文章。

  • 中秋節和大豐收的關聯?
  • 唱歌怎樣控制氣息?