Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h> // standardowe wejscie/wyjscie
- #include <math.h> // funkcje matematyczne
- #define JednaTrzecia (1.0/3.0) // pozwala zdefiniowac slowo kluczowe ktore pozniej bedzie podmienione na odpowiednia wartosc ((1.0)(3.0) )
- #define JednaTrzeciaFloat (1.0f/3.0f)
- #define TOLERANCE 2e-50// okresla ile cyfr po przecinku pokazywac
- int main(void)
- {
- int n;
- char znak_do_testowania;
- // deklaracje - informacje o nazwie i typie zmiennych (moga by zbudowane z malych i wielkich liter)
- n = 1/3; // instrukcja przypisania( do pewnej lokacji jest przypisywana wartosc ktora bedzie w niej przechowywana)
- znak_do_testowania = 'a'; // stała znakowa
- float f = 1.0/3.0; // stałe
- double d = 1.0/3.0; // zapis
- d=f;
- // przypisywanie wartosci do danej zmiennej w momencie jej deklaracji
- printf("liczby i znaki: znak = %c, n = %7d, f = %20.15f, d = %20.15lf\n", znak_do_testowania, n, f, d);//operacje wypisywania wartosci zmiennych
- d = 1111 + 1000 * n; d = (double) n;// zmiana int na double - pozwala na przechowanie wiekszej ilosci informacji
- n = f + 2.5; n = (int) f;// zmiana float na int - pozwala na przechowywanie mniejszej ilosci informacji
- f = (double) (n / 3);//n / 3.0;//n / 3; (double)n/3
- printf("\nNiejawne i jawne konwersje typów:\n");
- printf("liczby i znaki: n = %d, f = %f, d = %lf lub d = %le\n", n, f, d, d);// dochodzi do uzycia operatora wiec sa jawne
- d = JednaTrzecia * 0.966661;
- double e = JednaTrzeciaFloat * 3.0;
- float g = JednaTrzeciaFloat * 3.0f;
- printf("\nPrecyzja stałych i niejawne konwersje:\n");
- printf("(1/3)*0.966661: \td = %20.15lf; e = %20.15lf, g = %20.15lf\n", d, e, g);// w pewnych przypadkach beda wystepowac problemy z dokladnoscia
- operatory i ich priorytety - programowanie zaawansowane a programowanie bezpieczne
- double h;
- h = f + d; // do testowania: f++d; f+++d najlepiej nawiasy aby bylo pewnie (f+d; f++;) (++d;f+d;))
- printf("\nPriorytety operatorów:\n");
- printf("\td = %20.15lf; f = %20.15lf, h = %20.15lf\n, d, f, h);
- x = a++; x = ++a; //wyniki beda sie roznily poniewaz jedno dublikuje wartosc poczatkowa a dugie wynik dodawania
- n = 1574;
- int m = n % 7;// %- modulo- reszta z dzielenia
- int o = n / 7;
- printf("\nn = %d, n/7 = %d, n%7 = %d, n = (n/7)*7 + (n%7) = %d\n", n, o, m, o*7+m);
- // // wartość logiczna wyrażeń
- // printf("\nWartość logiczna wyrażenia: %d<%d wynosi %d\n", n, m, n<m);
- // printf("\nWartość logiczna wyrażenia: %d<%d lub %d>%d wynosi %d\n", n, m, n, m, (n<m)||(n>m));
- // // kłopoty z precyzją:
- // double dx1 = 1.23e7;
- // double dx2 = 1.23e-7;
- // printf("\ndx1 = %20.15lf, dx2 = %20.15lf, \n",
- // dx1, dx2);
- // if( (dx1+dx2)-dx1 == dx2 ){
- // printf("\n(dx1+dx2)-dx1 == dx2 (dla double)\n");
- // }
- // else {
- // printf("\n(dx1+dx2)-dx1 != dx2 (nawet dla double!) ( (dx1+dx2)-dx1 = %20.15lf )\n",
- // (dx1+dx2)-dx1);
- // }
- // // kłopoty z precyzją:
- // float fx1 = 1.23e7;
- // float fx2 = 1.23e-7;
- // printf("\nfx1 = %20.15lf, fx2 = %20.15lf, \n",
- // fx1, fx2);
- // if( (fx1+fx2)-fx1 == fx2 ){
- // printf("\n(fx1+fx2)-fx1 == fx2 (dla float)\n");
- // }
- // else {
- // printf("\n(fx1+fx2)-fx1 != fx2 (dla float) ( (fx1+fx2)-fx1 = %20.15lf )\n",
- // (fx1+fx2)-fx1);
- // }
- // // obsługa błędów - temat rzeka
- // // wariant prosty:
- // // chcemy obliczyć 1 / ( (fx1+fx2)-fx1 ) - powinno być równe 1/fx2
- // // próba uniknięcia dzielenia przez zero:
- // // if( fx2 != 0.0 ){ - błędy 1. (fx1+fx2)-fx1 != fx2, 2. porównanie float
- // // poprawna próba uniknięcia dzielenia przez zero lub utraty precyzji:
- // if( fabs ((fx1+fx2)-fx1) < TOLERANCE){
- // printf("\nPróba dzielenia przez liczbę bliską zero! Przerwanie programu!\n");
- // //return(-1);
- // // lub exit(-1) - exit przerywa wykonanie całego programu, nie tylko aktualnej funkcji
- // }
- // float fx3 = 1.0f / ((fx1+fx2)-fx1); // powinno byc równe 1/fx2...
- // printf("\n1.0f / ((fx1+fx2)-fx1) = %20.15lf\n", fx3);
- // double dx3 = 1.0 / ((dx1+dx2)-dx1); // powinno byc równe 1/dx2...
- // printf("\n1.0 / ((dx1+dx2)-dx1) = %20.15lf != 1.0/dx2 = %20.15lf\n", dx3, 1.0/dx2);
- // printf("Zostały tylko trzy cyfry znaczące na skutek skończonej precyzji...\n");
- printf("\nProgram dotarł do końca\n");
- return(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement