2011-10-28 50 views

回答

12

你的問題可能有幾種解釋。

如果只是角度和存儲在磁盤或設備上,我會建議你使用完全不同的技術存儲你的值:存儲爲32位整數。

int encodedAngle = (int)(value * (0x7FFFFFFF/180.0)); 

要恢復它,請做相反的事情。

double angle = (encodedAngle/(0x7FFFFFFF/180.0)); 

以這種方式,你有完整的31位分辨率180度和1位的標誌。

你也可以用這種方法來保持你的值爲ram,與直接使用雙打相比,這個覆蓋的成本更高,但如果你想保持你的記憶低,但分辨率高,這可以很好地工作。 成本不是很高,只是一個從/到整數的轉換/來自雙倍和乘法,現代處理器會在很短的時間內完成它,並且由於訪問的內存較少,如果列表包含很多的值,你的代碼將更加友好的處理器緩存。

你的分辨率將180/((2^31) - 1) = 8.38190318 × 10^-8度,還不錯:)

+0

他不能使用無符號整數,因爲他必須表示從-360到360的值。很好的答案。 –

+2

對於經緯度來說,+ -360肯定是一個虛假的要求...無論如何,這個答案是正確的,並且使用浮點數肯定是錯誤的,除非你想在倫敦附近有很高的精度和太平洋可怕的量化... –

+0

更正爲是-180 .. + 180 –

5

單精度浮點數的分辨率大概是360 /(2^23)或4 * 10^-5。

更確切地說,嚴格低於360.(可完全表示)的最大單精度浮點數約爲359.999969。對於整個範圍-360. .. 360,您將能夠表示差異,至少與這兩個數字之間的差異一樣小。

+0

神奇的是,我的計算結果認爲,對於lon/lat最多5米左右,這對我來說是不可接受的。感謝您的幫助! – Robert

+1

@Robert當你需要統一的分辨率時,浮點格式有點浪費(儘管我會承認它們很方便)。使用單精度浮點數時,分辨率受23位尾數的限制,當您可以有2^32個均勻間隔的值時。對於雙精度,分辨率受52位尾數的限制,您可以使用全部64位來表示均勻間隔的值。 –

1

通常float是4個字節(32位),而double是雙倍的。但是,如果您正在進行計算,則確切的精確度是實現(和硬件)特定的。在某些系統中,所有浮點數將被存儲爲雙精度,只是爲了增加混淆。

0

依賴,而是不能。

32位浮點存儲7位有效數字。對於存儲經度/緯度的正確分辨率而言,這通常太少。例如,openstreetmap.org使用逗號後的六位數字,所以最少八位,最大總數十位。

總之,使用float64。