使用字节的Java定点算法
我有一些属于[-1,1]的值。我不需要太多的准确性,但我需要很多这样的价值观。现在我更喜欢硬件,所以我毫不费力地找到了解决方案:使用定点算法。我希望通过使用8位Java字节类型来节省内存,它的精度为2^(-7)=0.0078125。是否有一种方法可以做到这一点并解决截断/过流(欠流)问题 我还希望尽可能避免计算开销,因为这些值也将进入大量计算使用字节的Java定点算法,java,byte,fixed-point,Java,Byte,Fixed Point,我有一些属于[-1,1]的值。我不需要太多的准确性,但我需要很多这样的价值观。现在我更喜欢硬件,所以我毫不费力地找到了解决方案:使用定点算法。我希望通过使用8位Java字节类型来节省内存,它的精度为2^(-7)=0.0078125。是否有一种方法可以做到这一点并解决截断/过流(欠流)问题 我还希望尽可能避免计算开销,因为这些值也将进入大量计算 谢谢我理解你这样的问题。由于最终变量的存在,下面的代码给出了性能 最后一个字节x=-1; 最后一个字节y=1 记住,对于字节数据类型,您必须小心谨慎 字节
谢谢我理解你这样的问题。由于最终变量的存在,下面的代码给出了性能 最后一个字节x=-1; 最后一个字节y=1 记住,对于字节数据类型,您必须小心谨慎 字节b1=x*y;给出了错误。做如下事情 字节b1=(字节)(x*y) 是否有一种方法可以做到这一点并解决截断/过流(欠流)问题 这取决于你们想如何处理这些问题。您似乎建议将
字节
值视为缩放值。现在Java没有任何内置的对缩放数字的支持,所以你必须仔细地做你的算术。。。自己处理截断、下溢和缩放调整
这是可以做到的。。。如果你小心的话
但是值得吗
首先要考虑的是,<代码>字节字段或本地变量与<代码> int <代码>完全相同的空间,或者<代码>浮点< /代码>字段…32位。(在64位机器上可能会有更多。)
事实上,只有当字节实际上是字节[]
的成员时,才能节省内存
然后你必须问问自己,为减少空间所做的努力是否真的值得。你测量过这些按比例缩放的字节值有多少吗?您是否将其与应用程序中的其他内存使用情况进行了比较?您知道需要表示多少这些按比例缩放的字节值吗
我还希望尽可能避免计算开销,因为这些值也将进入大量计算
这就是问题所在。带有缩放值的算术运算将需要额外的指令,特别是当您想要检测溢出/下溢时。这将使您的应用程序速度变慢
我倾向于使用
float
来实现应用程序,它将自动处理所有的溢出和下溢问题。然后在真实数据上运行应用程序,查看它的速度,以及它使用了多少内存:
- 如果两者都可以接受,那就别管它了
- 如果内存使用量太大或速度太慢,请查看解决方法。如果您决定尝试比例数字方法:
- 使用
和float
byte
- 测试以纠正缩放算术代码,以及
- 仔细地对两个版本进行基准测试,以量化差异
- 使用
我无法预测结果会是什么。但我可以告诉你,很多人浪费时间优化不需要优化的代码。不要犯这样的错误-不要过早优化。您需要执行哪些操作,以及如何处理下溢等?基本上,您只需将数字视为一个浮点,二进制点位于符号位和剩余位之间。这并不是给你+1.0(这有多重要?),而是给你-1.0。加法/减法是直接进行的,但您必须始终在乘法/除法之后进行缩放(在移位之前,应以至少16位的精度执行)。请注意,实际的计算将以更高的精度执行--在堆栈上字节总是被加宽为int--因此您的局部变量也可能是int。另外请注意,Java有16位的“短”int,但在其他方面与字节类似,因此,如果字节限制过大,可以使用shorts。因为无论如何都必须以较宽的形式执行操作,溢出检测只是检查较宽值的“不重要”位是否与符号位匹配。我处理的是图形,应该可以很好地缩放。每个图形节点理想情况下需要200-300个值。我本来想容纳尽可能多的节点,但我想这种可伸缩性毕竟不值得这么麻烦。我会坚持浮球,好计划。如果可伸缩性(内存受限)在整个过程中确实非常关键,那么您可以随时重新访问实现。字节实例字段实际占用32位并非普遍正确。@HotLicks-您知道不正确的示例吗?(让我们排除Java ME…'因为这不太可能相关。)我确信IBM iSeries Java,ca 2001,没有将32位分配给一个字节,因为我是没有分配它们的人。(而且,通过这种方式,性能比基准测试提高了约5%,在基准测试战争中占据首位。)