Серия Тейлор. Программа делает меньше итераций

Поэтому мне необходимо рекурсивно вычислить e^x, используя факторизованную форму ряда Тейлора:

уравнение: е ^ х = 1 + х + (х ^ 2)/2! + ... + ((x^n)/n!))

U(n) = U(n-1)*(x/n)

точка останова |U(n)| ‹ эп.

package lab2;
import java.util.Scanner;

public class Lab2 {
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner in = new Scanner(System.in);
        System.out.println("Enter x: ");
        int x = in.nextInt();
        System.out.println("Enter 0 < e < 1: ");
        double e = in.nextDouble();
        double result = 1.0;
        int n = 1;
        double U = x / n;
        while (Math.abs(U) >= e)
        {
            double fa = 1;
            for (int i = 1; i <= n; i++)
                fa *= i;
            result += Math.pow(x, n) / fa;
            U *= x / ++n;
        }
        System.out.println("e^x = " + result);
    } 
}

Он работает только x + 1 раз, а затем отладка говорит, что U равно 0, и это наша точка останова. Я не могу понять, почему это происходит. Не могли бы вы мне помочь?


person Vasyl Butov    schedule 03.10.2017    source источник


Ответы (1)


Поскольку x и n являются целыми числами, их деление будет выполняться с использованием целочисленного деления. . Только после завершения деления результат повышается до double для сохранения в U. Чтобы выполнить деление с плавающей запятой, вы можете либо определить x как double, либо явно указать его при делении:

double U = ((double) x) / n;
person Mureinik    schedule 03.10.2017