我將很多經度和緯度作爲doubles
存儲,我想知道是否可以將它們存儲爲floats
。單精度浮點數大約爲零時的近似分辨率是多少
要回答這個問題,我需要知道當存儲值是經度/緯度(-180到+180)時,single precision floating point number的近似分辨率。
我將很多經度和緯度作爲doubles
存儲,我想知道是否可以將它們存儲爲floats
。單精度浮點數大約爲零時的近似分辨率是多少
要回答這個問題,我需要知道當存儲值是經度/緯度(-180到+180)時,single precision floating point number的近似分辨率。
你的問題可能有幾種解釋。
如果只是角度和存儲在磁盤或設備上,我會建議你使用完全不同的技術存儲你的值:存儲爲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
度,還不錯:)
他不能使用無符號整數,因爲他必須表示從-360到360的值。很好的答案。 –
對於經緯度來說,+ -360肯定是一個虛假的要求...無論如何,這個答案是正確的,並且使用浮點數肯定是錯誤的,除非你想在倫敦附近有很高的精度和太平洋可怕的量化... –
更正爲是-180 .. + 180 –
單精度浮點數的分辨率大概是360 /(2^23)或4 * 10^-5。
更確切地說,嚴格低於360.
(可完全表示)的最大單精度浮點數約爲359.999969
。對於整個範圍-360. .. 360
,您將能夠表示差異,至少與這兩個數字之間的差異一樣小。
神奇的是,我的計算結果認爲,對於lon/lat最多5米左右,這對我來說是不可接受的。感謝您的幫助! – Robert
@Robert當你需要統一的分辨率時,浮點格式有點浪費(儘管我會承認它們很方便)。使用單精度浮點數時,分辨率受23位尾數的限制,當您可以有2^32個均勻間隔的值時。對於雙精度,分辨率受52位尾數的限制,您可以使用全部64位來表示均勻間隔的值。 –
通常float是4個字節(32位),而double是雙倍的。但是,如果您正在進行計算,則確切的精確度是實現(和硬件)特定的。在某些系統中,所有浮點數將被存儲爲雙精度,只是爲了增加混淆。
依賴,而是不能。
32位浮點存儲7位有效數字。對於存儲經度/緯度的正確分辨率而言,這通常太少。例如,openstreetmap.org使用逗號後的六位數字,所以最少八位,最大總數十位。
總之,使用float64。
經度從-180到180不等,緯度從-90到90. – caf
好點,不正確。 – Robert