Получение вывода "Бесконечность" вместо фактических чисел
Я практикую некоторые 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.4e9worldPopulationGrowthRate
1,13initialYear
это 2016- твой цикл начинается,
i
это 1year
установлен на 2017growthExponential
установлен на 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());
}
}