使用byte的Java定点算法

时间:2013-02-17 13:29:47

标签: java byte fixed-point

我有一些属于[-1,1]的值。我不需要很多准确性,但我需要很多这些值。现在我更像是一个硬件人员,所以我可以毫不费力地找到解决方案:使用定点算法。我希望通过使用8位Java字节类型来节省内存,这样可以得到2 ^( - 7)= 0.0078125的精度。有没有办法可以做到这一点,并处理截断/超过(下)流量问题?

我还想避免尽可能多的计算开销,因为这些值也将进入大量计算。

由于

2 个答案:

答案 0 :(得分:1)

  

有没有办法可以做到这一点,并处理截断/超过(下)流量问题?

这取决于您希望如何处理这些问题。您似乎建议将byte值视为缩放值。现在Java没有任何内置的缩放数字支持,因此您将不得不仔细地进行算术运算...自己处理截断,下溢和缩放调整。

可以做到......如果你小心的话。


但这值得吗?

首先要考虑的是byte字段或局部变量占用与intfloat字段... 32位完全相同的空间。 (或者在64位机器上可能更多。)

实际上,如果字节实际上是byte[]的成员,则只会节省内存。

然后你必须问问自己,实现空间缩减的努力是否真的值得。你测量这些缩放的字节值有多少?您是否将其与应用程序中的其他内存使用情况进行了比较?你甚至知道需要表示多少这些缩放的字节值?

  

我还想避免尽可能多的计算开销,因为这些值也将进入大量计算。

有问题。使用缩放值的算法将需要额外的指令,尤其是在您想要检测上溢/下溢时。这会使您的应用程序变慢。


我倾向于使用float来实现应用程序,它将自动处理所有溢出和下溢问题。然后在真实数据上运行应用程序,看看它有多快,以及它使用了多少内存:

  • 如果两者都可以接受,请不要理会。
  • 如果内存使用率太大或速度太慢,那么请查看解决此问题的方法。如果您决定尝试使用缩放数字方法:
    • 使用floatbyte
    • 实施关键计算
    • 测试以更正缩放的算术代码,
    • 仔细对两个版本进行基准测试以计算差异。

我无法预测结果会是什么。但我可以告诉你,很多人浪费时间优化不需要优化的代码。不要犯那个错误 - 不要过早优化。

答案 1 :(得分:-2)

我理解你的问题。以下代码也会因最终变量而提供性能。

最后一个字节x = -1; 最后一个字节y = 1;

请记住,对于字节数据类型,您必须小心谨慎。

字节b1 = x * y;给出错误。请执行以下操作。

字节b1 =(字节)(x * y);