背景
私の解析アルゴリズムの設計時には、多くの数学的な操作があります。
例えばのような上下に丸め、丸め、最大値と最小値を求めています。
これらの動作は、いくつかの処理が必要とされており、比較的一般的な方法。私たちは、ジェネリッククラスMathのJavaオファーの使用をお勧めします。
理解と使用してライブラリ
ここでは、47の「効果的なJavaの」を参照してくださいすることができます理解し、ライブラリを使用します。
「効果的なJavaは、」これは、4つの利点があり音声:
- あなたの前に、標準クラスライブラリで書かれた標準ライブラリを使用することによって、あなたはこれらの専門知識を活用することができ、かつ他人の経験。
- 問題への特別なソリューションを提供する業務に関連していない時間を無駄にしないでください、ではなく、低レベルの詳細よりも、ビジネスロジックに時間を費やしています。
- メンテナンスと最適化作業が完了するために、専門家に引き渡さすることができます。
- コードが読みやすく主流に統合されます。
新発見
しかし、もちろん、我々はいくつかの興味深いものを見つけました。
なぜ切り上げと床戻り値の型はdoubleですか?
CEILは、(パラメータの値を倍以上の計算上の整数に等しい)浮動小数点数をとるためにバインドされています
床(以下、パラメータの値は、計算上の整数に等しい倍にする)、それに対応する結合された浮動小数点下取ります
ここで疑問が、なぜ明らかに結果が計算上の整数である、それは二重の値にそれを返しますか?なぜ、int型の値を返していないのですか?
答えは簡単です:範囲はダブルint型よりも大きいため。リターンint型ならば、この方法は、不正確なデータにつながります。
なぜ丸い戻り値の型はint /長いのですか?
丸めの数学へのラウンドと同様の、最も近い長整数パラメータに返されます。
なぜリターンはそれを倍にも存在しないのですか?実際には、長い範囲は、二重よりも小さくなっています。
基本タイプ:ビットの長い数:64
包装:がjava.lang.Long
ミン:Long.MIN_VALUE = -9223372036854775808(-2 63乗)
最大:はLong.MAX_VALUE = 63 9223372036854775807パワー-1(2 )
基本タイプ:ビットの二重数:64
包装:java.lang.Doubleの
最小:Double.MIN_VALUEに= 4.9E-324(2の-1074番目のパワー)
最大:1024 Double.MAX_VALUE = 1.7976931348623157E308(2のサイド-1)
答え:ラウンド宣言は、最も近いlong double型の引数の型に戻すことです。現象が範囲外現れた場合は、長い境界を返します。
/**
* Returns the closest {@code long} to the argument, with ties
* rounding to positive infinity.
*
* <p>Special cases:
* <ul><li>If the argument is NaN, the result is 0.
* <li>If the argument is negative infinity or any value less than or
* equal to the value of {@code Long.MIN_VALUE}, the result is
* equal to the value of {@code Long.MIN_VALUE}.
* <li>If the argument is positive infinity or any value greater than or
* equal to the value of {@code Long.MAX_VALUE}, the result is
* equal to the value of {@code Long.MAX_VALUE}.</ul>
*
* @param a a floating-point value to be rounded to a
* {@code long}.
* @return the value of the argument rounded to the nearest
* {@code long} value.
* @see java.lang.Long#MAX_VALUE
* @see java.lang.Long#MIN_VALUE
*/
なぜ、ラウンドとはceil /フロアデザインコンセプトは矛盾しているのですか?
ラウンドのリターンは/ long int型、切り上げ/床は、二重の操作については、このデザインコンセプトポイントと矛盾返します。
答えは:JDKの設計には矛盾がありません、彼らは事をしていませんでした。ラウンドRINTに相当し、それは二重の最寄りのパラメータの型がdoubleを返します。
慎重な設計メソッドシグネチャ:ここでは、「効果的なJavaの」第40条を見ることができます。
When in doubt, look to the Java library APIs for guidance. While there are plenty of inconsistencies — inevitable, given the size and scope of these libraries — there are also fair amount of consensus.
如果有疑问,应当参考Java库api。尽管设计存在大量的不一致性(考虑到这些库的规模和范围,这是不可避免的),但也存在相当多的共识。
ラウンド丸めは時々問題を抱えているのはなぜ?
0.49999999999999994ターンを丸め1
理由:ラウンドのJava 6(おそらく以前)において、(x)は、床(X + 0.5)として実装。これは病的なケースで指定エラーです。この実装は、もはやJavaの7の破壊を必要としません。
また1が奇数番号の前に所定の場所に丸めされたときにことを意味し、でも国際的な練習問題の家庭に奇数ラウンドがあるかもしれない、彼らはそれが公正の原則に反映されている家庭、上、さえある、締結しました。
要するに、私が言いたいです:丸めは、実際には非常に複雑で、浮動小数点数が飛んでいません。我々は正確な計算(特に量)を使用する場合、考慮すべき最初の事はフロートのいずれかを使用することです。
参考「効果的なJavaの」48バー:、正確な答えを必要とフロートの使用を避け、ダブル。
floatとdouble型は、科学技術計算やエンジニアリング、コンピューティングの設計のために主にあります。これは、バイナリ浮動小数点演算を実行します。これは、慎重に設計された、広範囲にわたる高速近似値のより正確な計算を提供することです。しかし、彼らが完全かつ正確な結果を提供していませんでした。