0

我正在尝试确定要在以后的计算中使用的数字的符号。

我有类似于以下的代码:

double value = someClass.someGetterMethod();
double sign = value / Math.abs(value);

我也试过:

double sign = (value < 0) ? -1d : 1d;

并非总是如此,但有时值是正数,符号是负数。

这两个变量都在非静态方法中的本地堆栈上,所以我不相信存在竞争条件。

不幸的是,我无法发布完整的源代码,也无法在较小的示例中复制它。我怀疑我的环境与它有关:

有问题的代码被打包到一个 jar 中,然后作为一个 zipgroupfileset 加载到一个插件 jar 文件中,该文件由 netLogo 作为“扩展”(插件)加载。因此启动了 NetLogo,它使用此代码加载包含类的插件 jar。

NetLogo 要求任何插件都需要针对 1.5 目标进行编译,因此我在我的 ant 构建文件中为 lib 和扩展设置了该设置。

我通过修改 netlogo vmargs 来连接我的 netbeans 调试器以允许远程调试

-Xdebug
-Xrunjdwp:transport=dt_socket,address=1000,server=y,suspend=n

我真的很难过。这是调试器如何显示变量的问题吗?可能是 NetLogo 的 1.5 编译目标要求有问题?

有任何想法吗?

谢谢

4

3 回答 3

1

这确实可能是一个显示问题,因为我看不到有问题的代码如何具有您描述的行为。

如果我对此进行故障排除,我会制作变量finalsign在之后计算value

final double value = someClass.someGetterMethod();
final double sign = (value < 0) ? -1d : 1d;

最后,我会在分配给sign. 如果在完成所有这些操作后,您可以触发打印valuesign带有不一致的标志,那么事情就大错特错了。

PS 我会敦促你考虑切换到Math.signum. 它可能无法解决您当前的问题,但它会更优雅地处理零和 NaN。

于 2011-07-18T18:24:35.387 回答
1

应该允许您消除所有歧义的解决方案是将值转换为原始 long 并检查有符号位的值:

long rawValue = Double.doubleToRawLongBits(value);
boolean isNegative = (rawValue & 0x8000000000000000L) != 0;
于 2011-07-18T18:56:00.447 回答
0

为什么要签双?int 对你有用吗?

由于浮点数/双精度数的性质,您计算符号的第一种方法可能容易出现舍入错误。我会说第二种方式:

double value = someClass.someGetterMethod();
int  sign = (value < 0) ? -1 : 1;

也许这会给你更好的结果。

于 2011-07-18T18:24:03.307 回答