Java raytracing float vs double

2.2k views Asked by At

Last semester we had to develop a raytracer for a course at school. School being done, I tried to fiddle a bit with it.

I wanted to see what would change if I changed all floating point calculations from double to float (all calculations being done with doubles). So I changed every variable to type float, and simply cast each double returned from the Math methods to float. Testing my raytracer on a couple of scenes showed a pretty decent performance increase.

Searching around the web I found various reasons why float could be faster, but also some saying that double could be as fast, or even faster in a 64-bit environment. The thing is, I am running in a 64-bit environment and JVM. What would be the reason for this increased performance?

Now, I'm reading the PBRT book and planning to rewrite a raytracer from scratch following this. Would choosing float for all floating point calculations pose any problems? I didn't notice any during my tests, but perhaps for certain scenes the lower precision might (intersection testing seems like where it could pose a possible problem)? Or perhaps a tradeoff, like using double for the critical tests and float for less critical calculations? I would have to use an other Math library to get rid of the casting, would I be going the float way.

2

There are 2 answers

0
Durandal On BEST ANSWER

There is pretty much no difference between float and double when it comes to speed of calculation, as far as desktop processors are the platform. The difference can only come from the increased memory bandwidth requirements because doubles require twice as much space.

Its different for GPU based calculations, those are more tailored for float and e.g. Nvidia GPU's break down considerably for double.

I'd go with a mixed approach; store data like polygons with float precision, but do all calculations in double. Small memory footprint, high precision - win-win.

0
Benny Jobigan On

I'm answering so late that this is probably irrelevant to you, but perhaps helpful to others. I'm also working on a ray tracer in Go as a personal project (also using the PBR book), and had the same question...32 or 64 bit floats. I think I'm going to go with 32 bit mainly for one reason: SIMDizing ray-triangle intersection tests. No matter which instruction set your processor can use (eg SSE4, AVX2, AVX512), it can perform 2x the amount of 32-bit fp ops per instruction vs 64-bit.