将Java浮点数转换为C.

时间:2012-10-10 06:49:01

标签: java c floating-point

我有一个使用包含大量浮点数的对象的java程序。 事情是出于优化原因,我需要将部分代码转换为C.

对于基准测试,我已经在C中转换了所需的方法。 事情不是将对象作为输入,而是采用那些浮点数组。

我将这些数组保存在Java文件中,以便从我的C代码中轻松访问它。 问题是,Java浮动和C浮动显然是完全不同的,我在我的C代码中得到虚拟值。

我没有在互联网上找到任何可以帮助我完成这项任务的资源。 I did find this,但它适用于C ++,我无法访问这些类。

你有什么建议吗? 我想我可以开发某种转换器,但可能需要一些时间,而且可能有更好的在线解决方案。

谢谢,

编辑:

我使用DataOutputStream及其writeFloat方法保存float数组。

2 个答案:

答案 0 :(得分:5)

我会使用JavaCL或JavaCV直接使用GPU。

注意:这些库也适用于Intel / AMD CPU,因此如果GPU不快,则不需要使用GPU。

BTW:浮点数用Java和C是一样的。但是,如果使用ObejctOutputStream,则只能由Java读取,如果使用DataOutputStream,则数据将采用Big Endian格式。如果您的Intel / AMD CPU是小端,则必须交换字节。

如果您使用ByteBuffer和NIO来编写数据,您可以将其设置为big endian或little endian。后者不需要翻译。

注意:您可以通过JNI访问float[]FloatBuffer,这意味着它不需要写入文件。

使用FloatBuffer我建议

FloatBuffer fb = ByteBuffer.allocateDirect(size*4)
                           .order(ByteOrder.nativeOrder())
                           .asFloatBuffer();

答案 1 :(得分:3)

首先,您可以在GPU上运行Java程序而无需转换为C:project RootBeer

其次,Java浮动与C浮动相同。诀窍是正确地写和读它们。我建议使用FileChannelByteBuffer,它们具有读取和写入浮点数的方法。注意字节顺序,ByteBuffer有方法来设置所需的顺序。