Javaでは、変数を浮動小数点数から1を引いた値と浮動小数点数を乗じた値との差はありますか?-xとx * -1.0fの間に違いはありますか?
答えて
「単項マイナス演算子 - 」xは+0.0である場合ので、我々は浮動小数点値について
ことが判明し、否定は、次いで、ゼロからの引き算と同じではありません0.0-xは+0.0であるが-xは-0.0である。 単項マイナスは、浮動小数点数の符号を単に反転します。関心のある特別なケース:
オペランドがNaNの場合、結果はNaNです。 (NaNには符号がありません(§4.2.3)。
オペランドが無限大の場合、結果は反対の符号の無限大になります。
オペランドがゼロの場合、結果は反対の符号が0になります。
(ハイライト鉱山)
差は、放出されたバイトコードに見ることができます。単項マイナスは単純なfneg
であり、(-1f * x)
はfload
とfmul
になります。これはおそらくわずかに遅くなります。
JITコンパイラが最適化するかどうかはわかりません。
可読性のために、通常は-x
を使用してください。
JavaはIEEE 754-2008に従っていますか? NaNに影響を及ぼすビットレベルの演算として否定を指定します: "5.5.1符号ビット演算実装は、サポートされているすべての算術フォーマットに対して、以下の同種の静穏演算符号ビット演算を提供しなければなりません。この演算では、浮動小数点数とNaNが同様に扱われ、例外はありません。これらの操作は、非正規のエンコーディングを伝播する可能性があります。 [...] negate(x)は、浮動小数点オペランドxを同じ形式のコピー先にコピーし、符号ビットを反転します。 negate(x)は減算(0、x)と同じではありません(6.3を参照)。 – njuffa
IEEE 754-2008では、NaNの符号ビットについてさらに述べています。 "6.3符号ビット。入力または結果がNaNの場合、この規格ではNaNの符号は解釈されません。ビット列 - copy、negate、abs、copySign - 時にはNaNオペランドの符号ビットに基づいてNaN結果の符号ビットを指定します。論理述語totalOrderもNaNオペランドの符号ビットの影響を受けます。 – njuffa
デフォルトでは、Javaはいくつかの自由を取り、精度の高い中間結果を可能にします。 'strictfp'キーワードを使って、JavaはIEEE 754に従いますが、http://stackoverflow.com/questions/11474424/any-ieee754r-compliant-implementations-for-javaによると、Javaは新しい754-2008の亜種を採用しませんでした。 – Polygnome
JavaはIEEEのバイナリ浮動小数点表現を使用し、記号は別のビットで表されます。 -1
を掛けて、符号を-x
に反転することは、この符号ビットをフリップすることによって行われ、残りの表現は変更されません。したがって、-1.0f
は正確な表現を持ち、x
という表現の精度を変更する可能性がないため、結果に違いはありません。
x
がすでにfloat
だった場合、違いはありません。しかし、-x
が読みやすくなります。
生産バイトコードに若干の違いがあります:私はfneg
命令がfload_1/fmul
より若干速いことを想像
float one(float);
Code:
0: fload_1
1: fneg
2: freturn
float two(float);
Code:
0: fload_1
1: ldc #2 // float -1.0f
3: fmul
4: freturn
float three(float);
Code:
0: ldc #2 // float -1.0f
2: fload_1
3: fmul
4: freturn
;:
float one(float x) {
return -x;
}
float two(float x) {
return x * -1.f;
}
float three(float x) {
return -1.f * x;
}
逆コンパイルをしますその差はごくわずかです(そして、おそらくJITによって最適化される可能性があります)。 JLS§15.15.4で
- 1. Pythonで `if bool(x)`と `if x`の間に違いはありますか?
- 2. "my_constructor:variable(x)"と "this.variable = x"のコンストラクタの違いはありますか?
- 3. xとget( "x")の間に奇妙な違いがありますか?
- 4. `export default x`と` export {x as default} `の違いはありますか?
- 5. 2xと2 * xに違いはありますか?
- 6. Request.ServerVariables ["HTTP_X_FORWARDED_FOR"]とRequest.Headers ["X-Forwarded-For"]に違いはありますか?
- 7. (function(x:<_))= xと(function(x:_))= xの違いは何ですか?
- 8. x * xとtable_of_sqr [x]との差はありませんか?
- 9. -xと〜x + 1の違い
- 10. OpenGL 3.xと4.Xの違いは?
- 11. char * xとchar xの間のsizeofの違い
- 12. C++のx = ++ iとx = i ++の違いは何ですか?
- 13. プロミスチェーンのPromise.allとx => Promise.all(x)の違いは何ですか?
- 14. "module self :: X"と "module X"の違いは何ですか?
- 15. X-XSRF-TOKENとX-CSRF-TOKENの違いは何ですか?
- 16. x = * p ++と* p ++の違いは何ですか; x = * p in c?
- 17. x = yとx = y == 1の違い
- 18. if(x){foo();の違い}とx? foo():0;
- 19. コスト関数、sum(x)とones(1、length(x))の違いは何ですか?* x?
- 20. Android:時間のミリ秒からX日 - X時間 - x分 - X秒の残り
- 21. pytest 3.xは2.xより重要なことはありますか?
- 22. イベントXのハンドラはありますか?
- 23. バインディングとxの違い:バインド
- 24. x:バインドとバインディングの違い
- 25. Xmingとsshの違い-x
- 26. UNHEXとXの違い(MySQL)
- 27. X.509とpemの違い
- 28. "X x(42)"と "X x = 42"を使用したオブジェクト構成の違い?
- 29. i <xの範囲と範囲(x)のiの違いは?
- 30. x number秒間にx個のオブジェクトの後にのみnotifydatasetchanged()を呼び出す方法はありますか?
後者は浮動小数点の負数になります。最初は '' x ''の型に依存します。 – npinti
はい、@npintiが指摘しているように、-xは整数型または倍精度型またはxがどんな型であっても-1.0fを乗算すると暗黙的にfloatに変換されます。 – Vucko
@Vucko:はい、しかし、彼は変数もフロートであると書いています。 –