Эта базовая программа, которую я написал для показателей, работает только с целыми числами - что я сделал не так? - PullRequest
0 голосов
/ 23 февраля 2019

Я строю некоторые базовые программы, чтобы практиковать разные техники программирования.Я думал, что написал программу для вычисления показателей, но она не работает правильно.

Она работает нормально, если я ввожу целые числа, т.е.квадрат (2,5), но (2,4,5) не работает.

public static double squared(double a, double b) {
    double a1 = a;
    double sq = 0;      
    while (b > 1) {
        sq = a*a1;
        a =sq;
        b--;
    }
    return sq;
}

public static void main(String[] args) {
    System.out.println(squared(2,2));
}

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Ваш алгоритм работает для целых чисел, но для вычисления степени с показателем с плавающей запятой ваш подход не сработает.

Сначала давайте выясним, что означает показатель с плавающей запятой, взяв пример pow(2, 4.5):

2^{4.5} = 2^{\frac{9}{2}} =\sqrt[2]{2^{4}}

Итак, чтобы вычислить это, сначала мы должны преобразовать число с плавающей запятой в дробь, а затем вычислить степень и квадратный корень.Это выполнимо, но это очень утомительно, и они являются гораздо лучшим решением для этого.

Если у нас есть A = x^{b}, где b может быть числом с плавающей запятой, а A является результатом, мыможет принимать логарифм обеих сторон:

\log(A) = b \log(x)

Что эквивалентно:

e^{\log(A)} = e^{b\log(x)}

Что упрощает до:

A = e^{b\log(x)}

Теперь это можно сделать на Java очень легко:

public static void main(String args[]) {
    double a = 2;
    double b = 4.5;
    double A = Math.exp(b * Math.log(a));
    System.out.println(A);
}

Если вы не хотите использовать встроенную функцию exp, мы можемиспользуйте формулу Ньютона-Рафсона для ее вычисления:

e^{x} = 1 + x/1! + x^{2}/2! + x^{3}/3!...

где: ! обозначает факториал числа.Ваш первоначальный алгоритм может быть использован для вычисления pow из x с целым показателем степени.

0 голосов
/ 23 февраля 2019

Ваша программа работает должным образом, если b является целым числом, потому что ваш код предполагает, что b является целым числом.

Тот же самый результат будет вычислен независимо от того, равен ли b 4 или 4,5, потому что 0 и 0,5 меньше 1 (таким образом, завершая цикл).

...