我有一些属于[-1,1]的值。我不需要很多准确性,但我需要很多这些值。现在我更像是一个硬件人员,所以我可以毫不费力地找到解决方案:使用定点算法。我希望通过使用8位Java字节类型来节省内存,这样可以得到2 ^( - 7)= 0.0078125的精度。有没有办法可以做到这一点,并处理截断/超过(下)流量问题?
我还想避免尽可能多的计算开销,因为这些值也将进入大量计算。
由于
答案 0 :(得分:1)
有没有办法可以做到这一点,并处理截断/超过(下)流量问题?
这取决于您希望如何处理这些问题。您似乎建议将byte
值视为缩放值。现在Java没有任何内置的缩放数字支持,因此您将不得不仔细地进行算术运算...自己处理截断,下溢和缩放调整。
可以做到......如果你小心的话。
但这值得吗?
首先要考虑的是byte
字段或局部变量占用与int
或float
字段... 32位完全相同的空间。 (或者在64位机器上可能更多。)
实际上,如果字节实际上是byte[]
的成员,则只会节省内存。
然后你必须问问自己,实现空间缩减的努力是否真的值得。你测量这些缩放的字节值有多少?您是否将其与应用程序中的其他内存使用情况进行了比较?你甚至知道需要表示多少这些缩放的字节值?
我还想避免尽可能多的计算开销,因为这些值也将进入大量计算。
有问题。使用缩放值的算法将需要额外的指令,尤其是在您想要检测上溢/下溢时。这会使您的应用程序变慢。
我倾向于使用float
来实现应用程序,它将自动处理所有溢出和下溢问题。然后在真实数据上运行应用程序,看看它有多快,以及它使用了多少内存:
float
和byte
我无法预测结果会是什么。但我可以告诉你,很多人浪费时间优化不需要优化的代码。不要犯那个错误 - 不要过早优化。
答案 1 :(得分:-2)
我理解你的问题。以下代码也会因最终变量而提供性能。
最后一个字节x = -1; 最后一个字节y = 1;
请记住,对于字节数据类型,您必须小心谨慎。
字节b1 = x * y;给出错误。请执行以下操作。
字节b1 =(字节)(x * y);