2010-05-17 36 views
2

在多人遊戲我開發,我們有一個是浮點數幾個值。後端(在PHP中)和前端(在Flash中)偶爾會對這些數字執行相同的計算,以儘量減少通信。我可以假設Flash和PHP會生成相同的浮點數嗎?

我目前正在確保雙方都使用64位雙打,但我可以安全地假設所有的計算都是一樣的嗎?

例如,字符串到浮點轉換怎麼樣 - 我應該擔心Flash具有可能與PHP不同的實現嗎? (如果發生這種情況,我們的遊戲將失去同步 - 客戶端會認爲它處於一種狀態,而服務器處於另一種狀態)

隨着一些測試,它出現是相同的,但我只是不確定。有人能爲我澄清這一點嗎?

+6

你存儲在一個64位浮點遊戲狀態?你可以使用一個64位整數嗎?花車是因爲,比方說,IE 6 – 2010-05-17 18:16:12

+0

最邪惡的事情,我想補充閃光的數學不好,當涉及到精密像這樣。你可以在這裏閱讀更多 - http://www.rogue-development.com/blog2/2009/05/reminder-floats-are-not-precise/ – Glycerine 2010-05-17 18:20:29

+0

你說得對,你在你的評論說。您可以從平臺之間測試這種邊緣案例開始,以檢查不一致性。 – luvieere 2010-05-17 18:37:47

回答

2

你不能,因爲不同的編譯器即使對於相同的表達式也可以產生不同的代碼,但是我們正在比較由神編譯的不同解釋器知道什麼。

取決於所需的精度,您通常會很好,但在計算數學上應該相同但實際上不相同時,由於操作順序不同,邊緣情況會發生,就像試圖平衡針在其尖端。定期更新不會改變數字以顯着方式略有不同的事實。

如果你想使用浮點數,你應該設計一些數值算法,並考慮到一些誤差。或者,您可以使用定點算術來處理性能可能受網絡限制但在其他地方使用浮點數的狀態。

0

我會假設它的確是相同的浮點代碼。除了定期發送檢查點(計算全部數據的幀而不是僅限於deltas),對嗎?在這些過程中會糾正任何小錯誤。

0

那麼,如果您可以限制重要的小數位數,那麼您將不會遇到舍入錯誤,並將您自己的字符串版本轉換爲浮點轉換以及您懷疑可能有的其他任何方法對平臺有不同的影響,我認爲你很好。

+2

但限制顯着小數位對諸如ceil(x)的操作不做任何處理,其中x可以是1.00000000001或0.9999999999 – Fragsworth 2010-05-17 18:27:47

相關問題