Вот подсказка для этого конкретного назначения: пусть x будет любым действительным числом.Напишите программу, которая вычисляет квадратный корень из x, используя метод деления пополам (https://docs.python.org/3/library/functions.html#format). * Обратите внимание, что вам следует свести эту проблему к методу деления пополам с естественным выбором a и b (т. Е. Пользователю не нужно предоставлятьa и b). Обратите внимание, что Math.pow
и Math.sqrt
недопустимы.
Проблема заключается в том, что я не получаю правильных ответов, когда вводю целые числа, например 100 (корень которого равен "10.0 ", но вместо этого консоль возвращает" 9.999997615814209 ") или 36 (" 6.0 ", но консоль возвращает" 5.999997138977051 "). Я думаю, что это может быть связано с тем, что я округляю числа, или просто с тем, что яиспользуя doubles
в целом, но я не очень хорошо понимаю математику в программировании. Спасибо за помощь.
import java.text.DecimalFormat;
import java.util.Scanner;
public class BisectionMethod {
public double a = 0;
public double b;
public double userInput;
public int iteration = 0;
public double midpoint;
public static void main(String[] args) {
BisectionMethod testClass = new BisectionMethod();
System.out.println("Answer: " + testClass.FindAnswer(testClass.FindInput(), testClass.a, testClass.FindInterval()));
}
public double FindInput() {
Scanner sc = new Scanner(System.in);
System.out.println("Enter the number to find the root for: ");
userInput = sc.nextDouble();
while (userInput < 0) {
System.out.println("Please enter a number bigger than 0: ");
userInput = sc.nextDouble();
}
sc.close();
return userInput;
}
public double FindInterval() {
while (b * b < userInput) {
b = b + 1;
}
return b;
}
public double RoundNumber(double number) {
//Rounds number to 4 decimal places.
String pattern = "#.####";
DecimalFormat formatNumber = new DecimalFormat(pattern);
double rounded = Double.valueOf(formatNumber.format(number));
return rounded;
}
public double FindAnswer(double number, double interval1, double interval2) {
midpoint = (interval1 + interval2) / 2;
double difference = (midpoint * midpoint) - number;
while (RoundNumber(difference) != 0) {
midpoint = (interval1 + interval2) / 2;
difference = (midpoint * midpoint) - number;
if (midpoint * midpoint < number) {
interval1 = midpoint;
} else {
interval2 = midpoint;
}
iteration = iteration + 1;
}
System.out.println("Iterations: " + iteration);
return midpoint;
}
}