Double型別只用8位元組儲存但範圍為什麼那麼大

2021-07-29 21:50:17 字數 937 閱讀 3990

double型別只用8位元組儲存但範圍為什麼那麼大

odps的double描述:

型別     描述                 取值範圍

double   8位元組雙精度浮點數。  -1.0e308 ~ 1.0e308

double用8位元組雙精度浮點數

1.0e+38

1.0乘以10的308次方,為什麼會這麼大?64位能表示的最大不應該是2^64嗎?

1,因為double型別是浮點數,這種型別可以用科學記數法表示,所以表示範圍非常大。

但是,使用可浮點數的代價就是損失了精度。它把這部分精度用於指數的表示。

所以double型別的優點就是資料範圍大,缺點是精度不足,大概只有15~16位有效位數。

2,它表示大數的代價就是損失了精度。舉個例子:假設我有0-9這10個數,我定義數n表示5n,那麼這10個數最大能表示5*9=45。

能表示的範圍是:0、5、10、15、20、25、30、35、40、45。最小值為0,最大值為45。所以表示的範圍是:0~45。

但1、2、3、4,......,41,42,43,44這些不是5的倍數的數就沒法精確表示了,只能在定義中把它們靠向0、5、......、40或者45。

這就是為了擴大表示範圍而損失了表示精度。

oracle number型別的最大字元個數是38

所以,oracle number能表示的最大整數為:a = 99999999999999999999999999999999999999(38個9)

如果轉換成double,會丟失精度,用double儲存以後,實際的結果為:b = 1e38 即 10^38 = 100000000000000000000000000000000000000

顯然:a ≈ b

但b不是我們期待的值,除非實際應用場景能夠認可。

所有oracle number不能簡單的轉為double儲存,會丟失精度。

位元組對齊 8位元組對齊

參考博文 參考1 參考2 參考3 在記憶體管理中經常使用位元組對齊來管理分配的記憶體。1 原理 2 演算法 2.1unsigned intcalc align unsigned int n,unsigned align 2.2 更好的演算法 unsigned intcalc align unsign...

測試8位元組對齊

對十六進製制和按位操作,總是糊塗,所以實際測試下 我的理解,不一定全部正確 32位的系統上,都以32位系統為例 乙個int型是4個位元組,所以0x3是 0x0003,四個位元組,其中3代表乙個位元組 8個二進位制位 00000011,0就是00000000了。乙個指標也是4個位元組,這個程式裡頭列印...

8位位元組對齊演算法

參考文章 8bit對齊演算法 void testalign 1byte 1位元組對齊 unsigned int align8bit unsigned int n 2byte 2位元組對齊 unsigned int align16bit unsigned int n 4byte 4位元組對齊 unsi...