Problem z programem do prostych obliczeń

0

Witam

Mam pewien problem , napisałem sobie prościutki kod ( ponieważ jeszcze jestem w trakcie uczenia się ). Oto kod

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        new Main();
    }

    public Main(){
        String tmp;
        int n, limit;
        double sum, test;

        tmp = JOptionPane.showInputDialog("Podaj limit ");
        limit = Integer.parseInt(tmp);
        // Math.pow - potegownaie, pierwsza wartosc to liczba, druga to potega
        // Jets to wzro na znajdywanie elementow ciagu 1 , 22, 33, 444
        //a = (int)Math.pow(n, 4) + (317/6)*(int)Math.pow(n, 3) - 347*(int)Math.pow(n, 2) + (4063/6)*n - 383 ;
        n = 1;
        sum = 0;

        test = ((double)317/6)*(double)Math.pow(n, 3) + ((double)4063/6)*n + (double)Math.pow(n, 4) - 347*(double)Math.pow(n, 2) - (double)383;
        System.out.println(test);
        
        do{
            sum += (double)Math.pow(n, 4) + ((double)317/6)*(double)Math.pow(n, 3) - 347*(double)Math.pow(n, 2) + ((double)4063/6)*n - (double)383;
            System.out.println(sum);
            n++;
        } while( n <= limit );

        System.out.println("Podana suma ciągu to : "+ sum );
    }
}

Chodzi o to że podczas liczenia sum nie dostaje poprawnej sumy. Weźmy pod uwagę limit = 1 zatem n będzie 1. Suma wychodzi 0.jakieśtamliczby a powinno wyjść 1. Dla porównania ułożyłem to samo równanie ale zamieniłem miejscami elementy równania, to drugie równanie zapisywane jest do zmiennej test. Tam jest poprawnie.
Nie wiem czy ja coś źle robię ? Czy może gdzieś jest jakoś źle zaokrąglana liczba ? Gdy wypisałem liczby pojedynczo i liczyłem z kalkulatorem było wszystko ok .

dodanie znacznika <code class="java"> - fp

0

To jest normalne zjawisko. Liczby typu double są pamiętane z pewnym przybliżeniem.
Uwagi o porównaniu dwóch wyników nie rozumiem, wzór na test różni się od wzoru wykorzystanego w pętli.

0

Wszystko w porzadku. Liczby zmiennoprzecinkowe sa przez komputer rozumiane w systemie binarnym i komputer nie jest w stanie poprawnie tego skonwertowac. Tak jak w systemie dziesietnym nie ma dokladnego odpowiednika ulamka 1/3 Uzyj klasy BigDecimal do obliczen bez bledu zaokraglania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1