Math.pow()をキャストする際の精度の低下

mat1:

intの最大値を計算しようとしましたが、intにキャストされた計算値がlongにキャストされた場合よりも低い理由がわかりません。(2^31) - 1電卓を上げたところ、値は

2_147_483_647

そして私がJavaで上昇し2^31、控除1するときも同じことを期待します、それはintの最大数を計算するはずです2147483647が、そうではありません。

System.out.println(((long) Math.pow(2, 31)) - 1); 
System.out.println((int) Math.pow(2, 31) - 1); 

最初の計算は以下を与えます: 2_147_483_647

2番目の計算により、 2_147_483_646

ザブザード:

最初の例

あなたがしたことを分析しましょう。最初の例は

((long) Math.pow(2, 31)) - 1;

あなたが最初に計算することを、この手段Math.pow(2, 31)どの収量を

2.147_483_648 E9

その後、にキャストしlongます。longこの値のための十分な場所があることに注意しください。

2_147_483_648

次に、減算1して取得します

2_147_483_647

2番目の例

次に、2番目の例の機能を見てみましょう。あなたが書いた

(int) Math.pow(2, 31) - 1

これは次のように解釈されます

((int) Math.pow(2, 31)) - 1

つまり、以前と同じですが、のint代わりにキャストを使用していlongます。ここで、値には十分な場所intないことに注意しくださいint表現できる最大のものは

2_147_483_647 // MAX_INTEGER

したがって、ここでもこの値を正確に取得できます。その後、あなたは減算1して得る

2_147_483_646

補正

あなたはそれを考えたと思います

(int) Math.pow(2, 31) - 1

評価する

(int) (Math.pow(2, 31) - 1)

しかし、そうではありません。これを明示的にすると、実際に

2_147_483_647

予想通り。


演算子の優先順位

これについては、Java言語仕様で読むことができます。JLS§15.15単項演算子を参照してくださいキャストは、減算などの演算子より優先されます。

これは、キャスト単項演算子であるのに対し、減算はバイナリであるからです。単項はバイナリよりも優先されます。公式ドキュメントは、したがって、概要として次の表を提供します:

+----------------------------------------------------------------+
| Operators             | Precedence (top is high, bottom low)   |
|-----------------------|----------------------------------------|
| postfix               | expr++ expr--                          |
| unary                 | ++expr --expr +expr -expr ~ !          |
| multiplicative        | * / %                                  |
| additive              | + -                                    |
| shift                 | << >> >>>                              |
| relational            | < > <= >= instanceof                   |
| equality              | == !=                                  |
| bitwise AND           | &                                      |
| bitwise exclusive OR  | ^                                      |
| bitwise inclusive OR  | |                                      |
| logical AND           | &&                                     |
| logical OR            | ||                                     |
| ternary               | ? :                                    |
| assignment            | = += -= *= /= %= &= ^= |= <<= >>= >>>= |
+----------------------------------------------------------------+

キャスティングはもちろん単項カテゴリの一部です

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

inputValのMath.pow()

分類Dev

JavaでMath.powを使用して、立方体の表面積と「スキップ」の難しさを判断する

分類Dev

Java Math 型キャスト

分類Dev

Math.powのJavaScript実装

分類Dev

Math.Pow関数の使用

分類Dev

Excelの数式をJavaScriptに変換する-Math.pow()?

分類Dev

math.piのPython精度

分類Dev

Java Math.pow(x、2.0)とMath.pow(x、2.0000001)のパフォーマンス

分類Dev

Pythonの指数-math.powとmath.sqrtではなく**演算子を使用するべきですか?

分類Dev

JodaTimeのMath.max(...)

分類Dev

else if math / bigの条件

分類Dev

Math.NetのTriangularSolver

分類Dev

整数のMath.Floor

分類Dev

bigIntのMath.exp()?

分類Dev

Math.round() の代替

分類Dev

Math.sin内のMath.radians

分類Dev

Microsoft SolverFoundationでのMath.Powの使用

分類Dev

型キャストMath.random?

分類Dev

指数演算子^とMath.pow()の違い

分類Dev

Math.pow での Java.Lang.Exception

分類Dev

Math.fmaを使用しての精度&パフォーマンスのメリットは何ですか?

分類Dev

Hat ^演算子とMath.Pow()

分類Dev

Pythonのべき乗-math.powとmath.sqrtではなく**演算子を使用すべきですか?

分類Dev

Math.Floorを使用する

分類Dev

Math.toRadiansを宣言する

分類Dev

Math.Pow(10、Math.Abs(1))は10に等しいですか?

分類Dev

Pythonのフロートの組み込みpow()とmath.pow()の違いは?

分類Dev

Math.Sqrt内のMath.Pow-このコードがわかりません

分類Dev

java.math.BigIntegerはjava.math.BigDecimalにキャストできません

Related 関連記事

ホットタグ

アーカイブ