Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用字节的Java定点算法_Java_Byte_Fixed Point - Fatal编程技术网

使用字节的Java定点算法

使用字节的Java定点算法,java,byte,fixed-point,Java,Byte,Fixed Point,我有一些属于[-1,1]的值。我不需要太多的准确性,但我需要很多这样的价值观。现在我更喜欢硬件,所以我毫不费力地找到了解决方案:使用定点算法。我希望通过使用8位Java字节类型来节省内存,它的精度为2^(-7)=0.0078125。是否有一种方法可以做到这一点并解决截断/过流(欠流)问题 我还希望尽可能避免计算开销,因为这些值也将进入大量计算 谢谢我理解你这样的问题。由于最终变量的存在,下面的代码给出了性能 最后一个字节x=-1; 最后一个字节y=1 记住,对于字节数据类型,您必须小心谨慎 字节

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

我还希望尽可能避免计算开销,因为这些值也将进入大量计算


谢谢

我理解你这样的问题。由于最终变量的存在,下面的代码给出了性能

最后一个字节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%,在基准测试战争中占据首位。)