获得无限'输出而不是实际数字

时间:2016-08-06 14:26:35

标签: java math infinity

我正在练习一些Java,我写的一个应用程序要求在未来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;
        }

    }
}

2 个答案:

答案 0 :(得分:1)

让我们仔细查看代码的第一次迭代,就好像我们正在调试它一样(确保将来尝试这样做!)

  • currentWorldPopulation = 7.4e9
  • worldPopulationGrowthRate是1.13
  • initialYear是2016
  • 您的循环开始,i为1
    • year设为2017
    • growthExponential设置为1.13 * 2017 = 2279.21(这是您问题的开始)
    • anticipatedWorldPopulation设置为7.4e9 * e ^ 2279.21
    • 这大约是7.4e9 * 7.05e989 ...... KABOOM

重温您的计算,并逐步完成您的应用程序(最好是在调试器中)以查看您的问题。

答案 1 :(得分:0)

@Krease发现了你的问题。

我记录了它。一旦你解决了这个问题,他发现它没问题。我使用了JDK 8 lambdas并给出了百分比和指数增长模型。代码打印以进行比较:

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());
    }
}
相关问题