Получение вывода "Бесконечность" вместо фактических чисел

Я практикую некоторые Java, и одно из приложений, которые я пишу, просит вывести население мира в следующие 75 лет.

Я использую модель роста населения. Моя проблема в том, что мое приложение выводит "Бесконечность" в столбце, где должна быть выведена оценочная численность.

Это мой код:

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 ответа

Давайте внимательно посмотрим на первую итерацию вашего кода, как если бы мы отлаживали его (убедитесь, что вы попытаетесь сделать это в будущем!)

  • 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

Пересмотрите свои расчеты и просмотрите свое приложение (в идеале в отладчике), чтобы увидеть свои проблемы.

@Krease нашел вашу проблему.

Я перекодировал это. Как только вы решите проблему, он обнаружит, что все в порядке. Я использовал JDK 8 лямбд и дал вам как процентную, так и экспоненциальную модели роста. Код печатает оба для сравнения:

import java.util.function.DoubleFunction;


/**
 * Simplistic population growth model
 * @link  https://stackru.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());
    }
}
Другие вопросы по тегам