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

問題のコードがあなたが説明した動作をどのように行うことができるかがわからないため、実際には表示の問題である可能性があります。

これをトラブルシューティングする場合、変数を作成し、直後にfinal計算します。signvalue

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

最後に、への割り当ての直後に両方の変数を出力しsignます。valueこれらすべてを行った後、一貫性のない兆候の印刷をトリガーできる場合はsign、何かが深刻に、深刻に間違っています。

PS への切り替えを検討することをお勧めしますMath.signum。おそらく現在の問題は解決されませんが、ゼロと NaN がもう少し適切に処理されるようになります。

于 2011-07-18T18:24:35.387 に答える
1

すべてのあいまいさを取り除くことができる解決策は、値を raw long に変換し、符号付きビットの値を確認することです。

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

符号が double なのはなぜですか? int はあなたのために働きますか?

符号を計算する最初の方法は、float/double 数値の性質により、丸め誤差が発生しやすい可能性があります。私は2番目の方法で行くと思います:

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

たぶん、これでより良い結果が得られるでしょう。

于 2011-07-18T18:24:03.307 に答える