2013-04-18 72 views
2

我現在正在做一個計算長整數的源代碼,但我不知道爲什麼這個計算給了我錯誤的答案。長整數計算

long l; 
//variable l is where you input long, signed int 

l *= 0x6869L; 
if(l == 0xeaaeb43e477b8487L) 
    System.out.println("Correct!"); 

我做0xeaaeb43e477b8487/0x6869 = 0xFFFFCBBB6D375815 但是當我計算0xFFFFCBBB6D375815 * 0x6869給0xEAAEB43E477BA89D。

爲什麼會發生這種情況?這個數學問題的真正答案是什麼?

+0

什麼編程語言這是? – Acebulf 2013-04-18 03:27:35

+0

這是Java語言。但我認爲每種語言在使用64位整數時都有同樣的問題。 – Nagi 2013-04-18 03:28:08

+0

無論如何,你爲什麼期待'0xeaaeb43e477b8487L'?這三個十六進制數組合在一起的意義是什麼? – Makoto 2013-04-18 03:34:43

回答

3

這是因爲當你分開0xeaaeb43e477b8487L/0x6869時,你失去了餘數,導致精度下降。

0xeaaeb43e477b8487L % 0x6869= -9238 

,如果我們考慮到這一點,我們會得到

0xEAAEB43E477BA89DL -9238 = 0xeaaeb43e477b8487 

這個作品

if ((l - 9238) == 0xeaaeb43e477b8487L) 
    System.out.println("Correct!");