Dominika 129 wyśw. 06-07-2024 22:22

Zad dom 3 - Zadanie 20



Przy wpisywaniu (tylko) niektórych wartości dla double liczba, co trzecia wartość jest w dziwnej formie. Z czego może to wynikać?

public class MyClass {

   public static void main(String[] args){


 int rozmiar=17;   

 double liczba=3.2;

 int ilosc=6;


 double tt[]=stworzTablice(rozmiar,liczba,ilosc);

 System.out.println("Stworzona tablica: ");

 for(int i=0; i<rozmiar; i++){System.out.print(tt[i] + " ");}}




 static double[] stworzTablice(int rozmiar, double liczba, int ilosc){

    

     double tab[]=new double[rozmiar];

  

    

     if (ilosc<=rozmiar){

         for(int i=0; i<ilosc; i++){tab[i]=liczba*(i+1);}

         for(int i=ilosc; i<rozmiar; i++){tab[i]=(ilosc - (i - ilosc + 1))*liczba;} return tab;}

        

     else {for(int i=0; i<rozmiar; i++){tab[i]=liczba;}return tab;}}}


Programowanie Dodaj post do ulubionych Poproś o pomoc
s.gugula 08-07-2024 10:25

Wynika to najpewniej z faktu, że liczby zmiennoprzecinkowe (long, double itp.) są tak na dobrą sprawę tylko reprezentantami liczb rzeczywistych, tzn. przybliżają je z pewną dokładnością. I tak się składa, że w przypadku typu double to będzie właśnie ok. 15 miejsc po przecinku, więc tam w istocie przy różnych operacjach na tych liczbach może pojawić się gdzieś delikatna rozbieżność.

Gdyby np. zamiast double użyć typu float (który ma mniejszą dokładność), to te "pomyłki" pojawiłyby się już na wcześniejszych miejscach po przecinku. Zawsze zatem stosując liczby rzeczywiste w obliczeniach komputera godzimy się na pewną niedokładność - w zależności od typu będzie ona pojawiała się na dalszym lub bliższym miejscu po przecinku.

Tu oczywiście nie ma to jeśli chodzi o wyniki praktycznie żadnego znaczenia, natomiast "wizualnie" można poradzić sobie z tym wykorzystując np. funkcję printf - mówiliśmy o niej na zajęciach, można sobie np. ograniczyć wyświetlanie tych liczb do np. trzech miejsc po przecinku.