2016-08-06 10 views
-5

私はいくつかのJavaを実践しており、私が書いているアプリケーションの1つは、今後75年間に世界人口を出力するよう求めています。実際の数値の代わりに「無限大」出力を得る

私は人口増加モデルを使用しています。私の問題は、私のアプリケーションが推定人口が出力されるべき列に「Infinity」を出力することです。

これは私のコードです:

import java.util.Calendar; 
import java.util.regex.Matcher; 

public class WorldPopulationGrowth { 
    public static void main(String[] args) { 
     double currentWorldPopulation = 7.4e9; 
     double worldPopulationGrowthRate = 1.13; 
     double anticipatedWorldPopulation; 
     int initialYear = Calendar.getInstance().get(Calendar.YEAR); 

     System.out.println("Year\tAnticipated World Population (in billions)\tPopulation " + 
       "increase since last year"); 
     System.out.println(String.format("%d\t%.1e\t\t\t\t\t\t\t\t\t\t\tNA", initialYear, currentWorldPopulation)); 


     for(int i=1; i < 76; i++){ 
      int year = initialYear + i; 
      double growthExponential = worldPopulationGrowthRate*year*1.0; 
      anticipatedWorldPopulation = currentWorldPopulation * Math.pow(Math.E, growthExponential); 

      System.out.println(String.format("%d\t%.1e\t\t\t\t\t\t\t\t\t\t\t", year, anticipatedWorldPopulation)); 

      currentWorldPopulation = anticipatedWorldPopulation; 
     } 

    } 
} 
+0

デバッグを試しましたか?あなたの 'growthExponential'は現在の年で乗算されていますが、繰り返しごとに計算されます。 – Krease

+0

あなたは' Math.E'を使って数学で他の不正なことをしているようです。 currentPopulation'を繰り返しますが、毎回数千の威力でそれを上げています。 – Krease

+0

成長は、 'pow(GrowthRate、i)'または 'exp(log(GrowthRate)* i)'式でなければなりません。 – LutzL

答えて

0

@Kreaseはあなたの問題を発見しました。

私はそれを記録しました。問題を修正すると、彼はそれが問題ないことを発見しました。私はJDK 8ラムダを使用し、パーセンテージと指数成長モデルの両方を提供しました。両方の比較のためのコードプリント:(!あなたが将来的にこれを実行しようとしていることを確認してください)

import java.util.function.DoubleFunction; 


/** 
* Simplistic population growth model 
* @link https://stackoverflow.com/questions/38805318/getting-infinity-output-instead-of-actual-numbers/38805409?noredirect=1#comment64979614_38805409 
*/ 
public class WorldPopulationGrowth { 

    public static void main(String[] args) { 
     double currentWorldPopulation = 7.4e9; 
     double worldPopulationGrowthRate = 1.13; 
     int numYears = 76; 
     int startYear = 1976; 

     double populationExponential = currentWorldPopulation; 
     ExponentialGrowthModel modelExpGrowth = new ExponentialGrowthModel(worldPopulationGrowthRate); 
     double populationPercentage = currentWorldPopulation; 
     PercentageGrowthModel modelPercentGrowth = new PercentageGrowthModel(worldPopulationGrowthRate); 

     System.out.println(String.format("%10s %20.3e %20.3e", startYear, currentWorldPopulation, currentWorldPopulation)); 
     for (int i = 1; i < numYears; ++i) { 
      populationExponential = modelExpGrowth.apply(populationExponential); 
      populationPercentage = modelPercentGrowth.apply(populationPercentage); 
      System.out.println(String.format("%10s %20.3e %20.3e", startYear+i, populationExponential, populationPercentage)); 
     } 
    } 
} 

class ExponentialGrowthModel implements DoubleFunction<Double> { 

    private double exponent; 

    ExponentialGrowthModel(double exponent) { 
     this.exponent = exponent; 
    } 

    private double getExponent() { 
     return exponent; 
    } 

    public void setExponent(double exponent) { 
     this.exponent = exponent; 
    } 

    @Override 
    public Double apply(double value) { 
     return value*Math.exp(this.getExponent()); 
    } 
} 

class PercentageGrowthModel implements DoubleFunction<Double> { 

    private double percentageIncrease; 

    PercentageGrowthModel(double percentageIncrease) { 
     this.percentageIncrease = percentageIncrease; 
    } 

    private double getPercentageIncrease() { 
     return percentageIncrease; 
    } 

    public void setPercentageIncrease(double percentageIncrease) { 
     this.percentageIncrease = percentageIncrease; 
    } 

    @Override 
    public Double apply(double value) { 
     return value*(this.getPercentageIncrease()); 
    } 
} 
+0

数学はそれ以上ではありません;)質問に関する私のコメントを見てください。 – Krease

+0

コードをもっと慎重に読んでいるので、あなたが正しいことが分かります。営業担当者は、致命的な影響に対して年率増を伴うパワーモデルを混乱させています。 – duffymo

1

我々はそれをデバッグしているかのようさんが、あなたのコードの最初の繰り返しで慎重に見てみましょう

  • currentWorldPopulation = 7.4e9
  • worldPopulationGrowthRateは1.13
  • initialYearあるiは1 012で、あなたのループが始まる2016
  • です
    • yearは2017
    • growthExponentialに設定されている2279.21
    • ^E *
    • anticipatedWorldPopulationが7.4e9に設定されている(これはあなたの問題の始まりである)* 2017 1.13 = 2279.21に設定されている、これはおおよそです7.4e9 * 7.05e989 ... KABOOM

あなたを見て、あなたの計算を再検討し、(デバッガで理想的には)アプリケーションのステップ実行r問題。

+0

これは正解です。私はOPを受け取り、これをupvoteするように助言したいと思います。良い目、@が好き – duffymo

+0

ありがとう、それはまっすぐに得た。私は正しい0.0113の代わりに1.13として増加率を使用していましたが、年の代わりに、私はカウンタiで年を置き換えました。 –

+0

そして私は十分な評判があればこれをアップヴォートするでしょう! :) –

関連する問題