c語言高精度浮點運算有誤差消不掉

2025-03-28 16:50:13 字數 2868 閱讀 3214

1樓:匿名使用者

器,所說的出棧、入棧操作都是對st(i)的影響。

src,dst,dest,op等都是指指令的運算元,src表示源運算元,dst/dest表示目的操作肢笑旁數。

mem8,mem16,mem32,mem64,mem80等表示是記憶體運算元,後面的數值表示該運算元的記憶體位數(8位為一位元組)

x <-y 表示將y的值放入x,例st(0) 1. 資料傳遞和對常量的操作指令。

指令格式 指令含義 執行的操作。

fld src 裝入實數到st(0) st(0) fild src 裝入整數到st(0) st(0) fbld src 裝入bcd數到st(0) st(0) fldz 將裝入st(0) st(0) <

fld1 將裝入st(0) st(0) <

fldpi 將pi裝入st(0) st(0) fldl2t 將log2(10)裝入st(0) st(0) fldl2e 將log2(e)裝入st(0) st(0) fldlg2 將log10(2)裝入st(0) st(0) fldln2 將loge(2)裝入st(0) st(0) fst dest 儲存實數st(0)到dest dest <-st(0) (mem32/mem64)

fstp dest dest <-st(0) (mem32/mem64/mem80);然後再執行一次出棧操作。

fist dest 將st(0)以整數儲存到dest dest <-st(0) (mem32/mem64)

fistp dest dest <-st(0) (mem16/mem32/mem64);然後再執行一次出棧操作。

fbst dest 將st(0)以bcd儲存到dest dest <-st(0) (mem80)

fbstp dest dest《歷橡- st(0) (mem80);然後再執行一次出棧操作。

另外,站長團上有產品**,便宜有公升衫保證。

2樓:網友

試一下,把數字轉成字元,理論上只要字串長度夠長,就能表示無窮多個數,

為什麼浮點數運算會有誤差?

3樓:太平洋電腦網

其根本櫻亮原因是計算機所使用二進位01**無法準確表示某些帶小數位的十進位資料。汪衫。

將乙個十進位數值轉換為二進位數值,需要通過下面的計算方法:

1. 整數部分:連續用該整數除以2,取餘數,然後商再除以2,直到商等於0為止。然後把得到的各個餘數按相反的順序排列。簡稱"除2取餘法"。

2. 小數部分:十進位小數轉換為二進位小數,採用"乘2取整,順序排列"法。

用2乘以十進位小數,將得到的整數部分取出,再用2乘餘下的小數部分,然後再將積的脊陵寬整數部分取出,如此進行,直到積中的小數部分為0或者達到所要求的精度為止。然後把取出的整數部分按順序排列起來,即先取出的整數部分作為二進位小數的高位,後取出的整數部分作為低位有效位。簡稱"乘2取整法"。

3. 含有小數的十進位數轉換成二進位,整數、小數部分分別進行轉換,然後相加。

c語言浮點運算感覺很奇怪同樣的數,算出來結果卻不一樣,這是怎麼回事?

4樓:網友

計算機儲存和運算都是以二進位處理的,而表示式是十進位的,那麼儲存或運算時是要轉換成二進位,計算完成後輸出還要再轉換成十進位。

那麼你應該明白二進位每一位權重都是2^n,此處n為位號,位號分佈如下:

.3,2,1,0(小數點) -1,-2,-3...

權重分佈如下:

.2^3,2^2,2^1,2^0 (.小數點)2^-1,2^-2,2^-3

例如乙個二進位的。

整數部分:1的位號為0,因此1*2^0=1*1=1

小數點向右第乙個1:位號為-1,因此1*2^-1=1*1/2=

小數點向右第二個1:位號為-2,因此1*2^-2=1*1/4=

小數點向右第三個1:位號為-3,因此1*2^-3=1*1/4=

合起來1+,其他位依此類推。

無需想得太多,你可以明顯看到,二進位小數表達的數都是不同級別減半後的累加。與十進位的某些小數沒有一一對應,顯然轉換必然會發生誤差。

另一方面,儲存時cpu會對十進位小數會進行編碼,float的尾數長度為23位,階碼8位,符號佔1位,共32位。double是64位,無論如何精度都是有限的,因此也會存在誤差,時編譯器會將表示式先轉換二進位並運算運算,運算後再編碼儲存到變數中或臨時變數中,而運算是由cpu直接處理的,因此你可以看到有個的誤差數,而printf是個函式,對誤差進行了修正。

5樓:金色潛鳥

float 型數,記憶體是32位2進位,數的精度按十進位是 6到7位有效數字。

程式裡寫的是十進位,進入計算機後要化為 二進位 浮點數,記憶體32位2進位,超出32位的那部分會捨棄,引入 「截斷誤差」。

類似地,四則運算兩數相乘,也會引入 「截斷誤差」。

printf 輸出時 要做 二進位 到 十進位轉換,也帶來誤差。

所以 ,輸出的有效位只有 , 後面的數字不可靠,應略去。

按 精度按十進位是 6到7位有效數字, 上面兩種方法的結果 是 一樣的。

從這裡我們可以附帶學到,浮點數比較是否相等時,不能簡單地用 if (a==b); 比較,而要考慮乙個誤差, if ( fabs(a-b)

c++問題,書上說:所有的浮點數運算都是以雙精度進行的,即使僅含float型單精度運算的表示式,也

6樓:網友

這句話不對,以前看過類似的說法。

表示式中如果只出現float浮點型別,那麼表示式最終的型別不會是double。編譯器可能會用到特殊的暫存器和指令來計算表示式的值,但是這只是個實現細節,表示式最終的型別還是float。

下面是微軟msdn關於型別轉換的原文截圖(點選大圖顯示):

英文版:中文版:

c語言乘方運算,C語言乘方運算

c語言的乘來方運算可以利用庫 自函式pow。pow函式原型 double pow double x,double y 標頭檔案bai math.h cmath c 中 功能 計算x的duy次冪。參考代zhi碼 include include int main 輸出 9 include include...

c語言運算怎麼算,C語言 運算怎麼算

按位與,與運算就是全1得1,其他都得例 include intmain void 擴充套件資料c語言運算子 圓方括號 箭頭一句號 指的是第1級的運算子。其中圓方括號很明顯 箭頭指的是指向結構體成員運算子 句號指的是結構體成員運算子 八位與,七位異,六位或 其中八位與指的是第8級的按位與運算子 七位異...

C語言雙精度,單精度是怎麼計算的

實型變數分為兩類 單精度型和雙精度型,其型別說明符為float 單精度說明符,double 雙精度說明符。在turbo c中單精度型佔4個位元組 32位 記憶體空間,其數值範圍為3.4e 38 3.4e 38,只能提供七位有效數字。雙精度型佔8 個位元組 64位 記憶體空間,其數值範圍為1.7e 3...