C語言再學習 浮點數

2021-07-17 03:12:15 字數 1935 閱讀 4944

參考:

你應該知道的浮點數基礎知識

浮點數的表示

浮點數的表示和基本運算

單精度浮點float:可以精確到小數點後6位 

雙精度浮點double:可以精確到小數點後12位

c可以通過f或f字尾是編譯器把浮點常量當做float型別,比如2.3f和9.11e9f。

l或l字尾使乙個數字成為long double型別,比如54.3l和4.32e4l。

建議使用l字尾,因為字母l和數字1容易混淆

沒有字尾的浮點常量為double型別。(重點)。例:sizeof(1.9) = 8;

資料型別和佔位符之間的對應關係:

float%f/%g

double%lf/%lg

%f和%lf會保留小數點後面多餘的0   如 3.1400000   .2%f得 3.14

%g和%lg不會保留   如 3.14

在浮點數比較中不能使用《和》,千萬要留意,無論是float還是double型別的變數,都有精度限制。所以一定要避免將浮點變數用「==」或「!=」與數字比較,應該設法轉化成「>=」或「<=」形式。

請寫出float x與「零值」比較的if語句

const float epsinon = 0.000001;

if ((x >= - epsinon) && (x <= epsinon) 或者

if (

fabs(x)

<=epsinon)  

// fabs(x)取x的絕對值,其中epsinon是允許的誤差(即精度)。

我們先來看下浮點數二進位制表達的三個組成部分。

三個主要成分是:

下面我們來看個實際例子來解釋下轉換過程。

step 1 改寫整數部分

以數值5.2為例。先不考慮指數部分,我們先單純的將十進位制數改寫成二進位制。

整數部分很簡單,5.即101.。

step 2 改寫小數部分

小數部分我們相當於拆成是2^-1一直到2^-n的和。例如:

0.2 = 0.125+0.0625+0.007825+0.00390625即2^-3+2^-4+2^-7+2^-8….,也即.00110011001100110011

step 3 規格化

現在我們已經有了這麼一串二進位制101.00110011001100110011。然後我們要將它規格化,也叫normalize。其實原理很簡單就是保證小數點前只有乙個bit。於是我們就得到了以下表示:1.0100110011001100110011 * 2^2。到此為止我們已經把改寫工作完成,接下來就是要把bit填充到三個組成部分中去了。

step 4 填充

指數部分(exponent):之前說過需要以127作為偏移量調整。因此2的2次方,指數部分偏移成2+127即129,表示成10000001填入。

整數部分(mantissa):除了簡單的填入外,需要特別解釋的地方是1.010011中的整數部分1在填充時被捨去了。因為規格化後的數值整部部分總是為1。那大家可能有疑問了,省略整數部分後豈不是1.010011和0.010011就混淆了麼?其實並不會,如果你仔細看下後者:會發現他並不是乙個規格化的二進位制,可以改寫成1.0011 * 2^-2。所以省略小數點前的乙個bit不會造成任何兩個浮點數的混淆。

具體填充後的結果見下圖

練習:如果想考驗自己是否充分理解這節內容的話,可以隨便寫乙個浮點數嘗試轉換。通過 浮點二進位制轉換工具可以驗證答案。

c語言學習浮點數

浮點數即 小數 一般用 double型雙精度浮點數 lf float資料型別 單精度浮點數 表達的是乙個近似的數,到小數點後8位時誤差為 1 不能用 eg 9.99999999 f 用float定義出來 為10.00000000 include include includeint main ii ...

c語言整數轉浮點數 浮點數的秘密

我們在學習 c 語言時,通常認為浮點數和小數是等價的,並沒有嚴格區分它們的概念,這也並沒有影響到我們的學習,原因就是浮點數和小數是繫結在一起的,只有小數才使用浮點格式來儲存。其實,整數和小數可以都使用定點格式來儲存,也可以都使用浮點格式來儲存,但實際情況卻是,c 語言使用定點格式儲存整數,使用浮點格...

C語言 浮點數格式

description 輸入n 0 n 10000 個浮點數,要求把這n個浮點數重新排列 並非排序,而是對齊 後再輸出。每個浮點數中都有小數點且總長度不超過50位。input 第1行是乙個正整數n n 10000 後面n行每行乙個浮點數,每個浮點數中都保證小數點會出現。浮點數的長度不超過50位,注意...