2017-08-31 27 views
2

我想用一個科學準確的太陽系寫遊戲,並試圖找出在大規模使用座標的最佳方法。當我讀到Libgdx中的座標系時,它說它使用「浮點」來存儲座標數據。Libgdx可以在其座標系中存儲非常大的數字嗎?

我希望釐米精確度達到約55億公里,即小數點後12位。恐怕這個大的座標不準確。

有人可以對此有所瞭解嗎?

+0

我看到的所有Libgdx API都使用float而不是double。 –

+0

@StephenC它能夠準確地存儲小數點後12位嗎? –

+0

如果API僅支持「float」,那麼他們是否會以更高的精度「存儲」事物是沒有意義的。 (你知道Java float類型的精度是多少......我假設,如果沒有,你應該在跳入這個項目之前做一些自學習。) –

回答

2

我從來沒有使用libgdx庫,但看看它的API(例如Vector3或Rectangle),它似乎使用float s。

浮筒

Java的float表示二進制科學記數法的數字,即,每個數字是由一個23位的有效數和一個8位指數表示。把它看作一種形式(就像你銀行的轉賬表格,你必須寫出你想轉賬多少錢)。在每個框中可以編寫一個10float form

注:23 + 8 = 31,缺少的比特被用作數字的符號。在這個答案中,我們不處理負數或負指數。

精密

由於指數,花車獲得更大的數字不太精確。一些例子:

10_000_000 == 1E7 != 1E7 + 1 == 1.0000001E7 == 10_000_001 
100_000_000 == 1E8 == 1E8 + 1 == 1.0000000E8 == 100_000_000 

在10 尾數不夠精確代表的1

的差異讓我們計算精度爲你的使用情況,其中數字是不要大於5.5在釐米測量十億公里:

5.5×10 9 公里= 5.5×10 14 釐米= 1.11110100001110001101101 010100000011 ×2 釐米

由於我們只有23位來表示該號碼,它被近似爲

1.11110100001110001101101 ×2 釐米 = 549'999'989'489'664釐米
= 5'499'999'894'896.64 m = 5'499'999'894.896 64千米

您將會失去100多公里的距離!

可能的解決方法

  • 使用利用double,而不是float另一個庫。雙打有一個52位有效數字,對於你的用例來說足夠精確。
  • 每個位置使用兩個float s:粗略位置和細粒度偏移(不推薦)。
  • 不要試圖做到這一點。我懷疑任何人都可以在釐米級精確追蹤外層太陽系中的物體。
1

理想情況下,你要創建your own version of a Vector它使用BigDecimal,因爲你可以控制有效數的數量。由BigDecimal表示的數字的值因此是(無標度值×10標度),see Javadoc

1

這是一個很好的問題來彈出有趣的解決方案。

你的問題標籤爲libgdx,所以我的解決方案不會遠離使用它。讓我們在這裏解決每個問題。

不管,它仍然是浮

首先,我要告訴你,無論怎樣的定位精度(浮動,雙),你有,libgdx的底層系統,將與float走在最後。看到它的SpriteBatch類,它使用float表示每當需要在屏幕上畫東西時的位置,以及也根據float的位置以及它的位置的類Sprite類。

這意味着無論您的精度如何,東西都會在屏幕上繪製在float

精密

還沒有使用floatdouble的事情,你會得到浮點計算錯誤。如果你不能一發不可收拾(我不太瞭解你的遊戲需求),根據你的遊戲是否有關位置或其他事情,那麼你可能需要考慮使用BigDecimal。銀行應用程序會使用這樣的事情,因爲由於四捨五入錯誤它不會丟失任何一點,客戶可能會抱怨!

您可能會在遊戲對象中維護BigDecimal。您通過它們更新其位置,而不是在libgdx中設置位置的正常方式。但是無論何時你需要畫畫,你都可以通過doubleValue()獲得它的價值。爲什麼加倍而不是浮動?最好提供可用於遊戲的最高精度,因此當浮點數不能100%精確地表示數字時,會盡可能減小誤差。

BigDecimal爲慢

小心作爲BigDecimal比正常的浮點運算速度較慢。請參閱其基準herehere

解決辦法

因爲我看到,在一個時間點上,用戶只能看到你的空間有限的區域內。或者,即使您可能有一張允許用戶縮小圖以查看整個區域的空間圖,那時您並不需要精確度或精確度,但libgdx所做的默認方式已足夠,並且不需要切換遊戲庫(其他人大多也會基於float)。

那是,你仍然可以使用float但使用BigDecimal或者只是String代表屏幕上出現任何大的科學價值不計算在影響在運行時的遊戲性能涉及的原因。因此,我相信這可以讓我們縮小巨大的距離,因此您可以用相同的意圖來表示遊戲對象,使其成爲科學正確的。

相關問題