簡體   English   中英

c中的浮點運算

[英]Floating point operation in c

我們知道在C中,浮點范圍從單個精度的1.xxxx * 10 ^ -38到3.xxxx * 10 ^ 38。

在我的演講幻燈片上有這個操作:

(10^10 + 10^30) + (-10^30) ?= 10^10 + (10^30 + -10^30)
10^30 - 10^30 ?= 10^10 + 0

我想知道為什么10 ^ 10 + 10 ^ 30 = 10 ^ 30在這種情況下?
我想的是,由於FP的范圍可以降到10 ^ -38並且高達10 ^ 38,所以不應該有溢出,所以`10 ^ 10 + 10 ^ 30不應該最終為10 ^ 30。

如您對問題的評論所述,存儲數字的部分是有限的。 它被稱為有效數。

考慮以下簡單的14位格式:

[符號位] [5位指數] [8位有效數]

讓'bias'為16,即如果指數為16則實際為0(所以我們得到一個好的范圍或+/-冪)並且沒有隱含的位

所以,如果我們的數字大於2 ^ 8,如2048和0.5

我們的格式:

2048 = 2 ^ 11 = [0] [11011] [1000 0000]

0.5 = 2 ^ -1 = [0] [01111] [1000 0000]

當我們添加這些數字時,我們移動指數,使它們具有相同的小數位。 小數的比喻是:

5×10 ^ 3 + 5×10 ^ -2 => 5×10 ^ 3 + 0.00005×10 ^ 3

所以siginifcand不能容納12個地方:

2 ^ 11 + 0.000000000001 x 2 ^ 11 = 1.000000000001 x 2 ^ 11

所以它回到2 ^ 11

本質是有效數字的概念。 它是IEEE754 float的大約7位小數。 如果我們使用帶有7位有效數字的假設十進制浮點數,則以這種方式進行計算:

10^10 + 10^30 == 1.000 000 * 10^10 + 1.000 000 * 10^30
              == (0.000 000 000 000 000 000 01 + 1.000 000) * 10^30 (match the exponent part)
              => (0.000 000 + 1.000 000) * 10^30 (round the left operand)
              ==  1.000 000 * 10^30
              == 10^30

但是請注意,匹配操作和舍入操作是作為單個步驟完成的,即。 機器永遠不能處理有效數字太多的0.000 000 000 000 000 000 01 * 10^30

順便說一下,如果你在C中對浮點算術進行實驗,你可能會發現%a格式說明符很有用(在C99中引入)。但請注意, printf總是隱式地將float參數轉換為double

#include <stdio.h>

int main() {
    float x = 10e10, y = 10e30;
    printf("(%a + %a) == %a == %a\n", x, y, x+y, y);
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM