4

Java (およびおそらく他の言語) では、Math.pow が double で定義され、double を返すことを知っています。Java を書いた人々がなぜ int を返す pow(int, int) メソッドも書かなかったのか不思議に思っています。 )省略。私が知らないCSの複雑さに基づいた舞台裏の理由があると思わずにはいられません。

同様のトピックで、定義によりceil と floor は整数を返すのに、どうして int を返さないのでしょうか?

これを理解するのを手伝ってくれてありがとう。それは完全にマイナーですが、何年も私を悩ませてきました。

4

5 に答える 5

4

java.lang.Math は、C 数学ライブラリの機能を移植したものにすぎません。

Cの場合、CPUには浮動小数点数に対してMath.powを実行する特別な命令があるという事実に帰着すると思います(ただし、整数に対してはそうではありません)。

もちろん、言語はまだint実装を追加できます。実際、BigIntegerには1つあります。powかなり大きな数になる傾向があるため、それも理にかなっています。

ceil と floor は定義上整数を返すのに、どうして int を返さないのですか?

浮動小数点数は、 の範囲外の整数を表すことができますint。そのため、double引数が大きすぎて に収まらintない場合、 がそれを処理する良い方法はありませんfloor

于 2014-07-24T23:02:40.960 に答える
0

すべてintの s はdouble損失なしで にアップキャストでき、 a のpow関数はan の関数よりdoubleも効率的であるためintです。

于 2014-07-24T23:02:57.237 に答える
-1

その理由はMath.pow()(デフォルト実装のJNI)の実装の背後にあります。CPU には、double を入力および出力として使用する累乗モジュールがあります。自分でこれをより適切に制御できるのに、なぜJavaがそれを変換する必要があるのでしょうか?

床と天井の理由は同じですが、次の点に注意してください。

(int) Math.floor(d) == (int) d;   // d > 0
(int) Math.ceil(d) == -(int)(-d); // d < 0

Integer.MAX_VALUEほとんどの場合 (または前後の保証はありませんInteger.MIN_VALUE)。

Javaはあなたに残します

(int) Math.pow(a,b)

の結果は、入力によってはまたはでMath.powある可能性があるためです。NaNInfinity

于 2014-07-24T23:02:16.827 に答える