Błąd w dodawaniu double'i

0

Witam, mam dziwny problem, otóż chce utworzyć tablice która będzie zawierała wartośći od [-1, 1], tablica ma 200001 elementów, a różnica między każdym to 0,00001. Oto kod:

	public static void randomVars(double[] v) {
		v[0] = -1.0;
		for(int i = 1; i < v.length; i++) {
			v[i] = v[i - 1] + 0.00001;
			System.out.println(v[i]);
		}
	} 

Problemem jest błąd dodawania, oto kawałek wyjścia:

 
-0.99999
-0.9999800000000001
-0.9999700000000001
-0.9999600000000002
-0.9999500000000002
-0.9999400000000003
-0.9999300000000003
-0.9999200000000004
-0.9999100000000004
-0.9999000000000005
...

W ostateczności ostatni element jest równy 0.9999999999961675, a nie 1.0. Ma ktoś jakiś pomysł jak to ogarnąć?

0

To jest naturalne zachowanie komputera. Liczby zmiennoprzecinkowe są zaokrąglane. 0.1+0.1+0.1!=0.3

0

edit: bogdans zauważył, że ma być od -1 do 1.. poprawka:

  	double len2 = (tablica.length-1)/(double)2;
    	
    	for(int i=0; i<tablica.length; i++)
    	{
    		System.out.println(i + " = " +((i-len2)/(len2)));
    	}
0

for(i=0;i<=2/0.00001;i++) v[i]=i0.00001-1;
albo
for(i=0;i<=10000;i++){ double x=i
0.00001; v[10000-i]=x; v[10000+i]=x; }

0

Masz literówki.

        for(int i=0;i<=100000;i++)
        {   
            double x=i*0.00001; 
            v[100000-i]=-x; 
            v[100000+i]=x; 
        }
0

Oba Twoje propozycje są dużo lepsze od oryginału, ale drobne niezgodności są.
Dla pierwszej:
...
0,99996000000000020
0,99997000000000020
0,99998000000000010
0,99999000000000020
1,00000000000000000
Dla drugiej:
...
0,99996000000000010
0,99997000000000010
0,99998000000000010
0,99999000000000000
1,00000000000000000

0
double x=0.1+0.1+0.1;
double y=0.3;
System.out.printf("x = 0.1 + 0.1 + 0.1 = %17.15f\n",x);
System.out.printf("y = 0.3 = %17.15f\n",y);
System.out.println("Liczby x i y sa "+((x==y)?"rowne":"rozne"));

x = 0.1 + 0.1 + 0.1 = 0,300000000000000
y = 0.3 = 0,300000000000000
Liczby x i y sa rozne

0

ciekawe Machine epsilon

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