2013-10-30 85 views
3

我想運行具有周期性邊界條件的粒子模擬 - 爲簡單起見,我們假設一個長度爲1.0的區域的1D模擬。我可以使用下面的一小段執行這些條件:在Java中執行週期性邊界條件的最快方法

if (x > 1.0) 
    x -= 1.0; 
if (x < 0.0) 
    x += 1.0; 

但感覺「笨拙」 - 推廣這一較高的尺寸時尤其如此。我試圖做類似

x = x % 1.0; 

這需要的情況下x > 1.0照顧得很好,但不會做什麼,我想爲x < 0.0 。的「模量」版本和「手動」版本輸出的幾個例子以示區別:

Value: 1.896440, mod: 0.896440, manual: 0.896440 
Value: -0.449115, mod: -0.449115, manual: 0.550885 
Value: 1.355568, mod: 0.355568, manual: 0.355568 
Value: -0.421918, mod: -0.421918, manual: 0.578082 

對於我目前的應用中,「笨拙」的方法可能是夠好了。但是爲了成爲一名更好的程序員,我仍然想知道是否有一種「更好」(或者至少看起來更好看)的方式來做到這一點。

是的,我讀過this post,所以我知道爲什麼我想要的東西它不會做,那它不應該。我的問題不是關於這個問題,而是關於如何去做。

+0

是否有一個原因,只是把'if/else'放在一個方法中,可能被一個帶有指定邊界的字段的類所包裹,如果這是一個參數,是不可行的? – chrylis

+0

@chrylis:這絕對是一個更好的方法 - 但它仍然感覺有點笨拙。另外,雖然這次我沒有特別需要它,但很高興知道在高性能應用程序中使用這種分支機制的方法。 –

回答

4

您可以使用%這種輕微的修改x = (x + 1.0) % 1.0

+0

太棒了!這正是我所期待的! =) –

+1

考慮'x = -2.1' – bountiful

0

最好的辦法可能是減去值本身價值的地板上。按照IEEE標準計算浮點剩餘部分是相當複雜的,除非有人在可以檢測和加速「簡單情況」的系統上,特別是那些除數是2的冪的情況下,一對if語句恰好要更快。然而,考慮爲什麼fmod被設計成令人討厭的方式可能很有趣:如果fmod被設計爲返回一個介於0和紅利之間的值,那麼當紅利非常小時結果的精度當股利是一個非常小的負數時(精確度將被限制在除數的精確度上),正數會比精度好得多。使fmod的精度相對對稱於零的優點可能超過了使結果爲非負的優點,但這並不意味着IEEE是設計範圍限制功能的唯一好方法。

另一種結合IEEE方法和零因子方法優點的方法是指定一個mod函數必須產生一個結果,其數值是(對於d正值)小於數值的d/2,但不得少於-d/2。這樣的定義總是會產生一個可以在源操作數類型中表示的結果(如果D是非常小的值,以致D/2不能精確表示,模數的範圍將是對稱的)。不幸的是,我知道沒有任何庫函數可以用這種方式工作。

相關問題