Zakres podczas zapisu do pliku

0

Witam wszystkich serdecznie,
piszę program na metody numeryczne dotyczące interpolacji Lagrange'a.

Wszystko działa "prawie" poprawnie, błąd polega na zakresie przedziały domkniętego [ -1 ; 1 ], podczas zapisu do pliku rozpoczyna mi zapisywania od -1, interpolacja, jednak przy końcowym przedziale jest zakres do 0,99998 co jest błędnie pokazana na późniejszym wykresie (nie ma wartości w 1, a wykres jest symetrycznym W, tak więc brakuje "czwartej" kreski.

Moja funkcja zapisu oraz pętle przechodzące po funkcji:

	public static void main(String[] args) throws FileNotFoundException {
		int j = 0;
		double[][] tablicaF1 = new double[21][2];
		double[][] tablicaF2 = new double[21][2];
		for (double i = -1; i <= 1; i += 0.1) {
			tablicaF1[j][0] = i;
			tablicaF1[j][1] = function1(i);
			tablicaF2[j][0] = i;
			tablicaF2[j][1] = function2(i);
			j++;
		}

		
			// tworzę plik tekstowy dla function 1, N = 20
			File FunkcjaLagrange1N20 = new File("FunkcjaLagrange1N20.txt");
			// tworzę plik tekstowy dla function 1, N = 40
			File FunkcjaLagrange1N40 = new File("FunkcjaLagrange1N40.txt");
			// tworzę plik tekstowy dla function 2, N = 20
			File FunkcjaLagrange2N20 = new File("FunkcjaLagrange2N20.txt");
			// tworzę plik tekstowy dla function 2, N = 40
			File FunkcjaLagrange2N40 = new File("FunkcjaLagrange2N40.txt");

			// wykonujemy zapis z przedziali [-1; 1] z dokladnoscia 0.001
			PrintWriter zapis1 = new PrintWriter(FunkcjaLagrange1N20);
			PrintWriter zapis3 = new PrintWriter(FunkcjaLagrange2N20);
			for (double x = -1; x <= 1.0; x+=0.01) {
				zapis1.println(x + " " + lagrange(tablicaF1, x));
				zapis3.println(x + " " + lagrange(tablicaF2, x));
			}
			zapis1.close();
			zapis3.close();
			
			// wykonujemy zapis z przedziali -[1; 1] z dokladnoscia 0.001
			PrintWriter zapis2 = new PrintWriter(FunkcjaLagrange1N40);
			PrintWriter zapis4 = new PrintWriter(FunkcjaLagrange2N40);
			
			for (double  x=-1; x <= 1.0; x+=0.003) {
				zapis2.println(x + " " + lagrange(tablicaF1, x));
				zapis4.println(x + " " + lagrange(tablicaF2, x));
			}
			zapis2.close();
			zapis4.close();
	}
}

**
Parę wyników z pliku tekstowego:**

-1.0 0.03225806451612903
-0.99 -63.39011208456593
-0.98 -86.92663025766039
-0.97 -87.39625114620928
-0.96 -75.94547748491715
-0.95 -59.66768304490733
-0.94 -42.82125821253805
.
.
.
0.9700000000000014 -87.3962511462105
0.9800000000000014 -86.9266302576582
**0.9900000000000014 -63.3901120845596 // tu pojawia się błąd :(**

Jestem zielony w temacie JAVY, więc proszę tylko o pomoc osoby które mają chęci i są w stanie to zrobić, nie proszę "PRO HAJTÓW KODERÓW, KTÓRZY BĘDĘ SIĘ WYMĄDRZAĆ :d)

0

Nie przeglądałem szczegółowo ale myśle że:

  1. Reprezentacja zmiennoprzecinkowa jest skończona
  2. Niektóre wartości nie są (bo nie mogą) być reprezentowane dokładnie (np. 1/10 zapisana binarnie jest ułamkiem okresowym, więc nie jest przechowywana dokładnie)
    Ale to o tyle dziwne, ze ten program zapewne piszesz na Metody numeryczne, więc moze warto było uważać na zajęciach gdzie mówiliście o zmiennoprzecinkowej reprezentacji?

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