Java光线跟踪浮点与双精度

Java光线跟踪浮点与双精度,java,floating-point,raytracing,Java,Floating Point,Raytracing,上学期我们不得不为学校的一门课程开发光线跟踪器。放学后,我试着把它摆弄一下 我想看看如果我将所有浮点计算从double改为float(所有计算都是用double完成的),会发生什么变化。所以我将每个变量都改为float类型,并简单地将数学方法返回的每个double转换为float。在几个场景中测试我的光线跟踪器,显示性能有了相当不错的提高 在网上搜索时,我找到了各种各样的原因来解释为什么float可以更快,但也有人说double可以同样快,甚至在64位环境中更快。问题是,我运行在64位环境和JV

上学期我们不得不为学校的一门课程开发光线跟踪器。放学后,我试着把它摆弄一下

我想看看如果我将所有浮点计算从double改为float(所有计算都是用double完成的),会发生什么变化。所以我将每个变量都改为float类型,并简单地将数学方法返回的每个double转换为float。在几个场景中测试我的光线跟踪器,显示性能有了相当不错的提高


在网上搜索时,我找到了各种各样的原因来解释为什么float可以更快,但也有人说double可以同样快,甚至在64位环境中更快。问题是,我运行在64位环境和JVM中。性能提高的原因是什么


现在,我正在读PBRT的书,并计划在这之后从头重写一个光线跟踪器。为所有浮点计算选择浮点会带来任何问题吗?我在测试过程中没有注意到任何问题,但对于某些场景,可能精度较低(交叉点测试似乎可能会造成问题)?或者是一种折衷,比如使用double进行关键测试,使用float进行不太关键的计算?我将不得不使用另一个数学库来摆脱强制转换,我将采用浮点方式。

就桌面处理器平台而言,浮点和双精度在计算速度方面几乎没有区别。差异只能来自增加的内存带宽需求,因为翻倍需要两倍的空间

它与基于GPU的计算不同,这些计算更适合浮点运算,例如Nvidia GPU的双精度细分


我会采取混合的方法;以浮点精度像多边形一样存储数据,但所有计算都以双精度进行。内存占用小,精度高-双赢。

我回答得太晚了,这可能与您无关,但可能对其他人有帮助。我还在Go中做一个光线跟踪器作为个人项目(也在使用PBR书),我有同样的问题…32或64位浮点。我想我将使用32位主要是因为一个原因:模拟光线三角形相交测试。无论您的处理器可以使用哪个指令集(例如SSE4、AVX2、AVX512),它都可以执行每个指令32位浮点运算量是64位的2倍。

我相信
double d=1d
是两条指令,而
float f=1f
是一条指令。甚至在64位机器上。乱搞64位JVM。“我在64位环境中运行”64位操作系统不算作64位环境。您的编译器和其他工具(如JVM,如果您正在使用Java)也必须是64位的。您可以放一些代码吗@Java代码学徒我认为32/64位编译之间没有真正的区别?我正在64位版本的JVM上运行它。谢谢你的回答!这似乎是一个很好的折衷办法,我会试试的。