為什麼double型別的數值進行運算得不到數學上精確

2021-04-17 02:33:46 字數 2808 閱讀 7080

1樓:匿名使用者

這個bai涉及到二

進位制與du十進位制的轉換問題。

n進位制可以理zhi解dao為:數值×基數回的冪,答

例如我們熟悉的十進位制數123.4=1×10²+2×10+3×(10的0次冪)+4×(10的-1次冪);其它進位制的也是同理,例如二進位制數11.01=1×2+1×(2的0次冪)+0+1×(2的-2次冪)=十進位制的3.

25。double型別的數值佔用64bit,即64個二進位制數,除去最高位表示正負符號的位,在最低位上一定會與實際資料存在誤差(除非實際資料恰好是2的n次方)。

舉個例子來說,比如要用4bit來表示小數3.26,從高到低位依次對應2的1,0,-1,-2次冪,根據最上面的分析,應當在二進位制數11.01(對應十進位制的3.

25)和11.10(對應十進位制的3.5)之間選擇。

簡單來說就是我們給出的數值,在大多數情況下需要比64bit更多的位數才能準確表示出來(甚至是需要無窮多位),而double型別的數值只有64bit,後面捨去的位數一定會帶來誤差,無法得到「數學上精確」的結果。

2樓:匿名使用者

可以看

c語言或者liunx系統中有沒有函式,控制double型別的數值計算後結果保留2位小數。

3樓:韌勁

c語言中float,double型別,在記憶體中的結構(儲存方式)

從儲存結構和演算法上來講,double和float是一樣的,不一樣的

地方僅僅是float是32位的,double是64位的,所以double能儲存更高的精度。

任何資料在記憶體中都是以二進位制(0或1)順序儲存的,每一個1或0被稱為1位,而在x86cpu上一個位元組是8位。比如一個16位(2 位元組)的short int型變數的值是1000,那麼它的二進位制表達就是:00000011 11101000。

由於intel cpu的架構原因,它是按位元組倒 序儲存的,那麼就因該是這樣:11101000 00000011,這就是定點數1000在記憶體中的結構。

目前c/c++編譯器標準都遵照ieee制定的浮點數表示法來進行float,double運算。

這種結構是一種科學計數法,用符號、指數和 尾數來表示,底數定為2——即把一個浮點數表示為尾數乘以2的指數次方再添上符號。

下面是具體的規格:

型別 符號位 階碼 尾數 長度

float 1 8 23 32

double 1 11 52 64

臨時數 1 15 64 80

由於通常c編譯器預設浮點數是double型的,下面以double為例: 共計64位,摺合8位元組。

由最高到最低位分別是第63、62、61、……、0位: 最高位63位是符號位,1表示該數為負,0正; 62-52位,一共11位是指數位; 51-0位,一共52位是尾數位。

按照ieee浮點數表示法,下面將把double型浮點數38414.4轉換為十六進位制**。

把整數部和小數部分開處理:整數部直接化十六進位制:960e。

小數的處理: 0.4=0.

5*0+0.25*1+0.125*1+0.

0625*0+…… 實際上這永遠算不完!這就是著名的浮點數精度問題。所以直到加上前面的整數部分算夠53位就行了(隱藏位技術:

最高位的1 不寫入記憶體)。

如果你夠耐心,手工算到53位那麼因該是:38414.4(10)=1001011000001110.0110101010101010101010101010101010101(2)

科學記數法為:1.001……乘以2的15次方。

指數為15! 於是來看階碼,一共11位,可以表示範圍是-1024 ~ 1023。因為指數可以為負,為了便於計算,規定都先加上1023,在這裡, 15+1023=1038。

二進位制表示為:100 00001110 符號位:正—— 0 !

合在一起(尾數二進位制最高位的1不要): 01000000 11100010 11000001 11001101 01010101 01010101 01010101 01010101 按位元組倒序儲存的十六進位制數就是: 55 55 55 55 cd c1 e2 40。

4樓:匿名使用者

在c++中輸出一個浮點數n,並保留指定的小數位數,應該怎麼處理呢?首先先把iomanip標頭檔案包含進來,然後對浮點數n按下列操作輸出(假設保留2位小數):

cout<

c中還真的不記得,你可以看看這個函式對照下,自己寫一個。

5樓:匿名使用者

沒有四捨五入的話,要手動在後面加上

a = floor(a*100 + 0.5)/100.0;

6樓:匿名使用者

你是要把這個數繼續作為變數使用麼?

可以這樣子:

char sztmp[30] = "\0";

sprintf(sztmp, "%.2lf", a);

a = atof(sztmp);

這樣,兩位小數後面的都沒去掉了;

但是列印顯示的話 還是要用%.2lf,不然後面還是會有很多0,這是數值的精度位數;

7樓:昔拉

printf("a=%.2f",a);

.2f前面是有個小數點的,

還有什麼問題嗎

8樓:匿名使用者

printf("a=%.2f",a);

怎麼把Long或Double型別的數字轉換成位元組陣列

以下是int轉byte陣列,以及byte陣列轉int的方法 int對應4個位元組分別為 byte intbytes new byte 4 intbytes 0 byte x 24 intbytes 1 byte x 16 intbytes 2 byte x 8 intbytes 3 byte x 0...

怎麼通過定義的double型別的變數來查詢表

作為引數傳到sql裡面啊 在j a 中怎麼把double型別轉成 int型別 在android開發過程中我們常常遇到資料型別的轉換,其中double轉int型別是最常見的 方法一 強制轉換 int i double db i int db 這種方法會丟失小數點後面的值 int i double db...

網路小說的型別(懂得進,想了解魔獸簡史,懂得進!!!!!!!!!!

誅仙 星辰變 凡人修仙傳 仙逆 惟我獨仙 為仙俠 鬥破蒼穹 九鼎記 盤龍 琴帝 可以算玄幻。奇幻和異界大陸 玄幻。奇幻一般沒多大區別都是虛假,不真實的武俠算武功一類的 仙俠,東方修仙 都市。故事發生在都市 異大陸,就是不在我們這一空間的大陸 玄幻和奇幻差不多 都是講魔法和鬥氣的 有一些比較生僻的世界...