問一些c++程式的問題

#include

#include

int main(void)

{

char a='A';

short b=38;

float c=10.4f;

int d=12;

double e=8.4;

printf("(a) (b*c)=%f\n",(b*c));

system("pause");

return 0;

}

為什麼上面顯示出來的不是395.2而是395.199986?

float c=10.4f;<----------此行的10.4後面不加f有何影響? 加了是什麼作用?

麻煩各位大大替我解答

Update:

所以說要怎麼樣才能讓它顯示395.2? 還是沒有辦法這樣呢? 先謝謝你嚕~

1 Answer

Rating
  • 1 decade ago
    Favorite Answer

    電腦不是十進位的;是二進位。

    在小數部份,二進與十進值會相同的,只有分母為純二的程幕 (2^n)的部份!

    如:1/2, 1/4, 3/8, 等 (0.5, 0.25, 0.375)

    10.4的小數部份 0.4是 2/5,5不是2的乘幕!

    所以,在2進位,不是有限小數!於是就有了誤差!

    把它乘以 38(b),誤差就被放大 38倍!

    因此,你看的不會是準準的395.2那個 f 是說:數值是 float,不是 double。

    不加 f 的影響,是在執行時,才會由 double 轉成 float,當然會較慢、較費 RAM。

    哪不懂請補問。^_^

    2009-10-19 07:30:23 補充:

    有一個囉哆但能〝表面上〞解決的辦法!用『字串分析』或『指數/對數』!

    先知道你原始的數字有幾位小數,用小學數學得知:答案是幾位小數。

    限制印出時,就是那麼多位小數。就可以〝表面上〞解決!

    為何我〝表面上〞都要在〝表面上〞加〝〞?

    因為:實際上電腦裡的答案仍不是那個值!

    可有絕對解決之道?

    有! 用 Symbolic Calculation!

    但,要有耐心忍耐低速!

    2009-10-19 07:32:48 補充:

    怎麼指定印出位數?

    printf("%.1f\n", b*c);

    那個 .1 就可以指定印出一位小數。

    但若你的 c 是三位小數呢?

    所以我才會說:要先算出:答案是幾位數!

    2009-10-19 07:54:42 補充:

    當然,你用 double 會好一點,

    但只是〝會好一點〞,不是〝能徹底解決問題〞!

    而你用指數/對數等去求位數時,又有其它誤差要考慮!

    所以,要保險,只能用最麻煩的:字串分析!

    分析輸入的字串是幾位小數!

    但若數值來源不是文字式輸入,那就只能靠指數/對數了。

    就我所知,沒有更好的方法。

    2009-10-19 07:55:03 補充:

    再不然,你要寫個分析,去看那一堆 9 或 0,是不是代表10轉2 或 計算 的誤差!

    這在 float 通常行不通!

    因為:它才 7.22 位!

    扣掉真實數值 及 最後的誤差(如你的395.199986:395三位真實,1...86三位誤差),

    可用的位數可用的位數不到 7.22 - 3 - 3 = 1.22位!

    有 1.22 位的 9,你就能判定它叫做誤差? 你饒了我吧!

    2009-10-19 07:55:10 補充:

    不對啊! 有三位的 9耶!

    也就是說:395.1999 這七位才是 float 真正的數值!

    86 是那 .22 位轉出來的怪物!

    它暗示:〝答案〞的範圍,在+- 16595869!(註:16 與 86 同位置!所以是 0.0000158...)

    而答案是 395.2 < 395.20006595869 = 395.199986 + 0.00016595869

    所以,是在誤差範圍內沒錯!

    這部份很少人/書在談。

    相信這裡 99.9% 的網友沒見過才對。

    能證明我說謊的網友,

     (就是說:您在這篇及敝人論壇之外的地方,見過那 86 是啥?並見過如何推算得正確答案範圍。)

    敬請在意見區留言。

    2009-10-19 07:56:04 補充:

    前段

     註:16 與 86 同位置!所以是 0.0000158...)

    那裡寫錯!是

     註:16 與 86 同位置!所以是 0.000016595869...)

    2009-10-19 13:10:36 補充:

    真丟臉,又發現一個錯!

     而答案是 395.2 < 395.20006595869 = 395.199986 + 0.00016595869

     而答案是 395.2 < 395.20006595869 = 395.199986 + 0.000016595869

    另外,同位置指的是:同是小數下第五~六位

Still have questions? Get your answers by asking now.