0

最小から最大までの範囲があります。これらの値のそれぞれについて、計算によって一連の情報を生成したいと思います。この情報を印刷して出力したい。

ループが一度に範囲の1つの値の情報のみを出力する場合、この出力を生成するにはどうすればよいですか?

プログラミング経験-まったくの初心者。

コードは次のとおりです。基本的に、ユーザーが1を入力すると、min2のすべての値の情報が出力されます。それ以外の場合は、probBが1/2であるmin2とその情報のセットのみを出力します。また、min2に割り当てずにmin1(ユーザー入力から取得)を使用できますか?

int prompt = Integer.parseInt(input);   // user input
int min2 = 0;
double probB = 0;
for (min2 = min1; min2 < max1; min2++) // for loop
{
  if (prompt==1){
    int R = 0;
    double Rlow = 0;
    double Rhigh = 0;
    R = (int) (Math.sqrt(2) + 1)*min2;
    Rlow = (Math.sqrt(2)+1)*min2+ 1;
    Rhigh = (Math.sqrt(2)+1)*min2;
    System.out.println(min2);
    System.out.print(""+Rlow+""+Rhigh);
    System.out.println(R);
    probB = (R/R+min2)*(R-1/R+min2-1);
    System.out.println(probB);
  }
  else {
    int R = 0;
    double Rlow = 0;
    double Rhigh = 0;
    R = (int) (Math.sqrt(2) + 1)*min2;
    Rlow = (Math.sqrt(2)+1)*min2+ 1;
    Rhigh = (Math.sqrt(2)+1)*min2;
    probB = (R/R+min2)*(R-1/R+min2-1);

    if (probB == 1/2){
      System.out.println(min2);
      System.out.println(""+Rlow+""+Rhigh);
      System.out.println(R);
      System.out.println(probB);
    }
  }
}
4

1 に答える 1

3

それ以外の

    if (probB == 1/2){

使用する

    if (probB == 1.0d/2.0d){

1/2は整数として計算され、その値はゼロです。さらに良い:

    if (probB == 0.5d){

ただしprobB、結果の計算に丸めがある場合は、期待した場合でも正確に0.5にならない可能性があることに注意してください。最終結果'が'0.5であるはずの式を作成できますが、浮動小数点表現の不正確さのため、実際の結果は0.5に非常に近いですが、正確には0.5ではありません。あなたの最善の策は、次のようなことをすることです。

    if (Math.abs(probB-0.5d) <1.0e-10d)

つまり、10^10の一部に近い

浮動小数点の計算は非常に便利ですが、正確な表現ではないため、いくつかの落とし穴があります。10進数では、1 / 3、1 / 7など、正確に表現できない有理数のセット全体があります。桁数を拡張することで、任意に近づけることができます(0.33333333...または0.142857142857142...)ただし、正確な表現を10進数で記述することはできません。浮動小数点でも同じことが起こりますが(数値のセットが異なる場合)、FPの長さは固定されているため、0.1のような数値をFPで正確に表すことはできません。近いですが、正確ではありません。比較では、常にその可能性を考慮に入れる必要があります。

于 2012-09-13T01:33:18.397 に答える