asked in 電腦與網際網路程式設計 · 1 decade ago

請問這題普考考題有關float的程式執行結果為何?

各位高手 請問一下這題去年地方政府的考題

我對實數的觀念很差 是否可以解一下給我參考 多謝多謝

題目如下:

請問以下兩C 程式碼之結果為何?

若將參數a,b,c 視為實數則其C 值為何?

說明兩者結果為何不同?

並請建議如何修正程式使結果與將參數a,b,c 視為實數之結果相同。(20 分)

(案例一)

int a, b; // int : 整數

float c; // float : 4-byte 浮點實數

a = 1.0;

b = 2.0;

c = a / b;

printf(“ c = %f \n”, c); // 以實數格式列印

(案例二)

float a, b, c;

a = 2.0;

b = 0.00001;

c = a + b*b;

printf(“ c = %f \n”, c);

3 Answers

Rating
  • 1 decade ago
    Favorite Answer

    首先我們先看這個程式會有什麼輸出結果

    [案例一]:

    c = 0.000000

    [案例二]:

    c = 2.000000

    現在回到我們現實的世界!

    [案例一]:

    由我們的數學知道第一題的答案應該要0.5才對

    現在要來解釋為什麼第一題跑出來會是0.000000

    我們看到案例一中的a,b,c宣告

    其中a,b告訴compiler是整數

    c是浮點數(實數)

    再看到他的statement : →a / b

    因為你在宣告的時候告訴了編譯器a,b都為整數,所以當這兩個

    運算子在做運算時,他會把它視為"整數運算!"

    所以整數跟整數運算結果當然也是整數,

    所以他會算完之後把小數位去掉。

    因此造成算出來的答案是0。

    進入到第二個步驟:c=運算結果

    因為我們的運算結果是"整數(int)",但是我們c宣告他為浮點數

    故此時compiler不知道怎辦。因為不同的資料型態理當不能做

    運算,所以此時編譯器就會偷偷的把運算結果"再"轉為浮點數

    存入變數c中,因此我們看到(0.000000)

    [修正方法]:

    [法一]:

    a跟b改為宣告成浮點數

    float a,b;

    ---------------

    [法二]:

    a或b其中一個改成浮點數宣告:

    flaot a;

    int b;

    Note:為什麼這樣改可以呢,因為剛在上面提到了編譯器會偷偷的幫我們轉換資料型態,術語叫做"強制資料形態轉換"。

    (運算時當發現兩個資料型態不一樣時,會換成其中精確度較"高"的資料型態做運算!)

    所以你只要a,b其中有一個宣告成浮點數時,編譯器就會幫你把另外一個數轉成浮點數。

    《但書》:若你在指定參數時就有浮點數出現,此時出現浮點數的那個參數就必須宣告成float。

    理由假如你寫成int a = 2.2; →此時編譯器會看做a的值是2造成錯誤。

    ----------------------------------------------------------------------------------

    [案例二]:

    案例二在現實社會中算出來的答案應該為2.0000000001

    但是為什麼印出來會是2.000000

    1.第一個錯誤:

    因為在C語言裡面浮點數的儲存方法是使用IEEE 754規定的格式

    有三個部份:sign、Exponent、Significand

    (float/double)

    sign:紀錄正負號(1bit/1bit)

    Exponent:紀錄次方數(8 bits/11bits)

    Significand:紀錄數值(23bits/52bits)

    關鍵在a+b*b在做"加法"的時候使用float資料型態位數不夠儲存

    最耗的那個0.0000000001會被移除掉。

    [修政方法]:

    我們把資料型態改成容量較大的double來宣告a,b,c即可

    此時在作加法時就不會因為bits數不夠被移除掉。

    《但書》:但是我們把它改成double宣告時也會發現

    此時的輸出仍然為2.000000位什麼呢?

    這問題就出現在你的輸出表示法,

    因為printf函式中%f是表示浮點數,但他的小數位預設是6位

    但我們的0.0000000001是小數位有10位,

    此時還要再做一個修改:

    printf(" c = %1.10f\n", c);讓它可以顯示出10個位數的小數

    此時才會出現2.0000000001的答案,

    其中:%1.10f代表的是1是表示出一個整數,小數點後面的數字是表示出10位的小數位,

    所以我們要表示兩個整數位三個小數位就可以寫:%2.3f

    -------------------------------------------------------------------------------------

    《參考解答》:

    (1)

    float a, b; // <---修正成浮點數

    float c; // float : 4-byte 浮點實數

    a = 1.0;

    b = 2.0;

    c = a / b;

    printf(“ c = %f \n”, c); // 以實數格式列印

    (2)

    double a, b, c;//<----修正成雙倍精確度

    a = 2.0;

    b = 0.00001;

    c = a + b*b;

    printf(“ c = %1.10f \n”, c); //<---修正表示位數

  • 1 decade ago

    鴨子,你好像按錯了

    若將參數a,b,c 視為實數則其C 值為何?

    (案例二) 0.0000000001

    好像是

    (案例二) 2.0000000001

    2008-09-05 07:31:17 補充:

    不客氣。

    我也有答錯的時候,也有打字打錯的時候。

    還有二次,是看錯題目! @.@ :$:$ T.T

  • 鴨子
    Lv 6
    1 decade ago

    以下兩C 程式碼之結果為何?

    (案例一) 0

    (案例二) 2

    若將參數a,b,c 視為實數則其C 值為何?

    (案例一) 0.5

    (案例二) 0.0000000001

    兩者結果為何不同?

    數學實數為無線個

    但用float, double等有限的位元來存實數

    就會有誤差

    也就是多個(無限個)相近的實數會對到電腦中float/double的相同表示法

    如何修正程式

    (案例一) 改 float

    float a, b; // int : 整數

    float c; // float : 4-byte 浮點實數

    a = 1.0;

    b = 2.0;

    c = a / b;

    printf(“ c = %f \n”, c); // 以實數格式列印

    (案例二) 改double, printf格式 "%0.10lf"

    double a, b, c;

    a = 2.0;

    b = 0.00001;

    c = a + b*b;

    printf(“ c = %0.10lf \n”, c);

    2008-09-03 13:52:04 補充:

    謝謝 Jacob Lee 大大, 我答案打錯了!

    更正如下:

    若將參數a,b,c 視為實數則其C 值為何?

    (案例一) 0.5

    (案例二) 2.0000000001

Still have questions? Get your answers by asking now.