2015-06-25 62 views
9

上學期我們不得不爲學校的課程開發光線跟蹤器。學校正在完成,我試圖用它來擺弄一下。Java raytracing float vs double

我想看看如果將所有浮點計算從雙精度浮點計算更改爲浮點精度(所有計算都使用雙精度來完成),會發生什麼變化。所以我改變了每個變量的類型爲float,並簡單地將從Math方法返回的每個double轉換爲float。在幾個場景中測試我的光線追蹤器顯示出相當不錯的性能提升。

在網上搜索我發現了各種原因,爲什麼float會更快,但也有人說double可能在64位環境中更快,甚至更快。事情是,我在64位環境和JVM中運行。這種性能提高的原因是什麼?

現在,我正在閱讀PBRT書,並計劃在此之後重寫一個光線跟蹤器。爲所有浮點計算選擇浮點會造成什麼問題?在我的測試過程中,我沒有注意到,但是對於某些場景來說,較低的精度可能會(交叉點測試看起來像是可能導致問題的地方)?或者可能是一種折衷,比如對關鍵測試使用雙精度和浮點精度較低的計算?我將不得不使用其他數學庫來擺脫鑄造,我會採取浮動方式。

+0

我相信'double d = 1d'是兩條指令,而'float f = 1f'是一條指令。即使在64位機器上。使用64位JVM。 – jn1kk

+0

「我在64位環境中運行」64位操作系統不算作64位環境。你的編譯器和其他工具(如Java中的JVM)也必須是64位的。 –

+1

[浮點數是否比雙精度慢? 64位程序運行速度比32位程序快嗎?](http://stackoverflow.com/questions/5738448/is-float-slower-than-double-does-64-bit-program-run-faster-than-32 -bit-program) –

回答

6

有相當多float和double之間沒有區別,當談到計算的速度,儘可能桌面處理器是平臺。差異只能來自增加的內存帶寬需求,因爲雙打需要兩倍的空間。

它對於基於GPU的計算是不同的,它們更適合浮動和例如Nvidia GPU的雙倍大幅下滑。

我會採用混合的方法;以浮點精度存儲像多邊形這樣的數據,但以雙精度執行所有計算。小內存佔用,高精度 - 雙贏。

+0

感謝您的回答!這似乎是一個很好的折衷,我會嘗試。 – Koekje