web-dev-qa-db-ja.com

float / doubleにモジュラスを使用するにはどうすればよいですか?

私は学校プロジェクト用のRPN計算機を作成しています。モジュラス演算子に問題があります。 doubleデータ型を使用しているため、浮動小数点数ではモジュラスは機能しません。たとえば、0.5%0.3は0.2を返すはずですが、ゼロ除算例外が発生しています。

命令では、fmod()を使用するように指示されています。 javadocを含むfmod()を探していましたが、見つかりません。私はそれが私が作成しなければならない方法だと思い始めていますか?

編集:うーん、奇妙な。私はそれらの番号を再び差し込んだだけで、うまく機能しているように見えます...しかし念のため。 Javaで浮動型を使用する場合、mod演算子を使用する必要がありますか?このようなことはC++ではできないと思います(私は思う)。

44
ShrimpCrackers

最初に実行したときにタイプミスがあった可能性があります。

0.5 % 0.3を評価すると、期待どおり '0.2'(ダブル)が返されます。

Mindprodには、Javaで モジュラスの仕組みの概要 があります。

64
RodeoClown

Cとは異なり、Javaは整数と浮動小数点の両方に%を使用でき、(C89やC++とは異なり)すべての入力(マイナスを含む)に対して明確に定義されています):

From JLS§15.17.3

浮動小数点剰余演算の結果は、IEEE算術の規則によって決定されます。

  • いずれかのオペランドがNaNの場合、結果はNaNです。
  • 結果がNaNでない場合、結果の符号は被除数の符号と等しくなります。
  • 被除数が無限大、除数がゼロ、またはその両方の場合、結果はNaNになります。
  • 被除数が有限で除数が無限大の場合、結果は被除数に等しくなります。
  • 被除数がゼロで除数が有限の場合、結果は被除数に等しくなります。
  • 無限大、ゼロ、NaNのいずれも含まれない残りの場合、被除数nを除数dで除算した浮動小数点剰余rは、数学的な関係r = n-(d・q )ここで、qは、n/dが負の場合にのみ負、n/dが正の場合にのみ正の整数であり、その大きさは、nとdの真の数学的商の大きさを超えない範囲で可能な限り大きい整数です。

したがって、あなたの例では、0.5/0.3 = 1.6 ...です。 qは0.5(被除数)と同じ符号(正)であり、大きさは1(1.6の大きさを超えない最大の大きさの整数)であり、r = 0.5-(0.3 * 1)= 0.2

41

通常のモジュラス演算子はJavaでもこれで機能すると思いましたが、コーディングするのは難しくありません。分子を分母で除算し、結果の整数部分を取得します。それに分母を掛けて、分子から結果を引きます。

x = n / d
xint = Integer portion of x
result = n - d * xint
6
WhirlWind

fmodは、浮動小数点モジュラスを処理するための標準C関数です。あなたのソースは、JavaはCのfmod関数と同じように浮動小数点モジュラスを処理します。Javaでは%上の演算子は整数と同じ倍になります:

int x = 5 % 3; // x = 2
double y = .5 % .3; // y = .2
3
Michael Mrozek