0

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

我还想尽可能避免计算开销,因为这些值也将涉及大量计算。

谢谢

4

2 回答 2

1

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

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

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


但是这值得吗?

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

实际上,只有当字节实际上是 a 的成员时,您才会节省内存byte[]

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

我还想尽可能避免计算开销,因为这些值也将涉及大量计算。

有问题。具有缩放值的算术将需要额外的指令,特别是如果您想检测上溢/下溢。这往往会使您的应用程序变慢。


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

  • 如果两者都可以接受,那就别管它了。
  • 如果内存使用量太大或速度太慢,那么请寻找解决此问题的方法。如果您决定尝试按比例缩放的数字方法:
    • float使用和实现关键计算byte
    • 测试以校正缩放的算术代码,并且
    • 仔细对两个版本进行基准测试以量化差异。

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

于 2013-02-17T13:49:57.010 回答
-2

我理解你这样的问题。由于最终变量,以下代码也提供了性能。

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

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

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

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

于 2013-02-17T13:40:13.357 回答