1. 程式人生 > >浮點數與定點數問題

浮點數與定點數問題

在MOBA專案開發過程中,LFIXED類中定義了許多浮點轉定點的常量。

這個類用了很久,以往的同步測試中也沒有因為這些常量的使用產生過不同步問題。

然而,總覺得哪裡不安全,想了很久,終於把長久以來的疑問想清楚了:幀同步遊戲中浮點數為什麼不安全,如何做才能安全(同步)?

對於任何一個浮點數,在不同硬體上可能數值不同,產生不同的原因是什麼?

是不同硬體的演算法不同嗎?不是。

所有硬體都是按照浮點數的通用演算法儲存的,比如 0.1,

0.1f 轉換為二進位制的方法是不斷乘2取整數部分,直到精度達到要求(並對後面的一位四捨五入)。

產生不同數值的原因就在精度問題,不同機器的精度不同時就產生了不同的數值。

由以上原理論知:像0.5,0.25,0.125這樣 (1/2)的N次方的數值不會產生精度不同問題,因為它們能在精度範圍內儲存,

但超出精度儲存範圍的(1/2)的N次方的小數也可能會有問題的,如  (1/2)的24次方

 

其實幀同步遊戲中用到的浮點數常量並不多,可以先一臺機器上算出需要用到的浮點常量對應的定點數,儲存到檔案中,執行加載出來。

執行其間可能會用到浮點數,比如求兩個數值的比例,這時候的解決辦法是  A*1.0F/B ,其中A,B是定點數

至於走路同步問題,遊戲啟動時,各英雄位置是從檔案中讀取的定點數,因此保證了英雄初始位置各機器同步。走路過程中,伺服器只廣播方向(定點數),各端根據定點數速度和轉向算出新位置,這樣英雄每走一步後,其位置在各機器也是同步的