[C++] Obliczanie pierwiastka

Disnejx86
Użytkownik
Użytkownik
Posty: 529
Rejestracja: 25 wrz 2011, o 09:43
Płeć: Mężczyzna
Podziękował: 114 razy
Pomógł: 56 razy

[C++] Obliczanie pierwiastka

Post autor: Disnejx86 »

Hej. Mam taki problem. Mam zrobić program obliczający miejsca zerowe f.kwadratowej no i jak zdefiniowałem:

Kod: Zaznacz cały

int delta ;
To jak zdefiniować pierwiastek z delty? Jaka jest komenda na pierwiastek? Czy wystarczy po prostu skorzystanie, że \(\displaystyle{ \sqrt{a} > 0 \Rightarrow a > 0}\)?
Ostatnio zmieniony 6 lis 2011, o 09:45 przez Afish, łącznie zmieniany 1 raz.
Powód: Staraj się lepiej dobierać nazwy tematów, tak by wskazywały o czym jest treść zadania.
Awatar użytkownika
alfgordon
Użytkownik
Użytkownik
Posty: 2176
Rejestracja: 10 lis 2010, o 13:14
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 10 razy
Pomógł: 379 razy

[C++] Obliczanie pierwiastka

Post autor: alfgordon »

funkcja 'sqrt()'
biblioteka 'math.h'
Disnejx86
Użytkownik
Użytkownik
Posty: 529
Rejestracja: 25 wrz 2011, o 09:43
Płeć: Mężczyzna
Podziękował: 114 razy
Pomógł: 56 razy

[C++] Obliczanie pierwiastka

Post autor: Disnejx86 »

Kod: Zaznacz cały

#include <iostream>
#include <conio.h>
#include <math.h>

int main()
{
    float a ;
    float b ;
    float c ;
    float delta ;
    sqrt(delta);
    
    std:: cout << "Podaj liczbe a : " ;
    std:: cin >> a ;
    std:: cout << "Podaj liczbe b : " ;
    std:: cin >> b ;
    std:: cout << "Podaj liczbe c : " ;
    std:: cin >> c ;
    
    delta = b*b - 4*a*c ;
    
    if (delta == 0)
    {
              std:: cout << "Funckja ma jedno miejsce zerowe. Jest nim: " << -b/2*a ;
              
    }
    else if (delta < 0);
    {
         std:: cout << "Funkcja nie ma miejsc zerowych" ;
    }
    
    else if (delta > 0) ;
    {
         std:: cout << "Funckja ma dwa miejsca zerowe.
    }
    
    
    getch();
}
Ok. Jak dalej ma wyglądać program, i czy to co jest napisane jest dobrze?
wawek91
Użytkownik
Użytkownik
Posty: 795
Rejestracja: 2 cze 2010, o 08:56
Płeć: Mężczyzna
Lokalizacja: Tarnów
Podziękował: 14 razy
Pomógł: 66 razy

[C++] Obliczanie pierwiastka

Post autor: wawek91 »

Kod: Zaznacz cały

#include <iostream>
#include <conio.h>
#include <math.h>

int main()
{
    float a ;
    float b ;
    float c ;
    float delta ;
   
    std:: cout << "Podaj liczbe a : " ;
    std:: cin >> a ;
    std:: cout << "Podaj liczbe b : " ;
    std:: cin >> b ;
    std:: cout << "Podaj liczbe c : " ;
    std:: cin >> c ;
   
    delta = b*b - 4*a*c ;
   
    if (delta == 0)
    {
         std:: cout << "Funckja ma jedno miejsce zerowe. Jest nim: " << -b/2*a ;
             
    }
    else if (delta < 0);
    {
         std:: cout << "Funkcja nie ma miejsc zerowych" ;
    }
   
    else if (delta > 0) ;
    {
         std:: cout << "Funckja ma dwa miejsca zerowe. Są nimi: " << (-b-sqrt(delta))/2*a << 
         " oraz " << (-b+sqrt(delta))/2*a;
    }
   
   
    getch();
    return 0;
}
Tego Ci brakowało.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] Obliczanie pierwiastka

Post autor: Afish »

Jako że to C++, zatem nie math.h, tylko cmath. conio.h też lepiej nie używać, ale to szczegół. Najistotniejsze jest jednak porównywanie zmiennej typu float do zera poprzez operator ==. Tak się tego nie robi :) Należy pamiętać, że specyfika liczb zmiennoprzecinkowych sprawia, że możemy potraktować jako zero coś, co zerem nie jest (i na odwrót). Lepiej zrobić to w ten sposób:

Kod: Zaznacz cały

const double EPS   = 0.0000000001; // dokładność porównania z zerem
if(fabs(delta) < EPS){
 // możemy przyjąć, że delta jest zerem
}
Swoją drogą do takich obliczeń lepiej jest używać typu double. Jest o wiele dokładniejszy, a wbrew pozorom zazwyczaj jest też szybszy.
Xitami

[C++] Obliczanie pierwiastka

Post autor: Xitami »

numerycznie poprawniej 106658.htm#p416161
Disnejx86
Użytkownik
Użytkownik
Posty: 529
Rejestracja: 25 wrz 2011, o 09:43
Płeć: Mężczyzna
Podziękował: 114 razy
Pomógł: 56 razy

[C++] Obliczanie pierwiastka

Post autor: Disnejx86 »

Afish, nic nie rozumiem z tego co napisales, bo wiesz ja sie dopiero ucze od postaw, no ale dzieki.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] Obliczanie pierwiastka

Post autor: Afish »

:) No to spróbuję sparafrazować.
Jako że to C++, zatem nie math.h, tylko cmath. conio.h też lepiej nie używać, ale to szczegół.
Nagłówek math.h pochodzi z czasów biblioteki języka C, w języku C++ mamy nowe nagłówki i odpowiednikiem math.h jest cmath. Dlatego właśnie jego należy użyć. Odnośnie conio.h, to jest to nagłówek niebędący w standardzie biblioteki, więc dołączanie go tylko po to, aby użyć funkcji getch() nie jest najlepszym pomysłem. Żeby nie było - to nie jest błąd. Piszę o tym tylko po to, aby wskazać, że można użyć czegoś zamiast getcha (np. wczytywania zwykłego znaku przy użyciu cin), nic przez to nie tracąc, a mając kod, który teoretycznie ma skompilować się wszędzie.
porównywanie zmiennej typu float do zera poprzez operator ==. Tak się tego nie robi :) Należy pamiętać, że specyfika liczb zmiennoprzecinkowych sprawia, że możemy potraktować jako zero coś, co zerem nie jest (i na odwrót)
Liczby zmiennoprzecinkowe to nie są liczby rzeczywiste - poczytaj o ich reprezentacji i zrozumiesz, że nie da się przy użyciu floata/double'a przedstawić każdej liczby rzeczywistej (pomijam już oczywiście kwestię ograniczonej liczby bitów, co powoduje niemożność zapisania liczb bardzo dużych i bardzo małych). Przykładowo liczby \(\displaystyle{ 0.1}\) nie da się zapisać w systemie binarnym w postaci skończonej. Dlatego porównywanie liczb zmiennoprzecinkowych operatorem == może nam dać zły wynik, więc powinno się to robić inaczej.
Swoją drogą do takich obliczeń lepiej jest używać typu double. Jest o wiele dokładniejszy, a wbrew pozorom zazwyczaj jest też szybszy.
Za bardzo nie ma czego parafrazować ;) Wszystko zależy od architektury procesora, ale na normalnych pecetach zazwyczaj double jest szybszy (i oczywiście dokładniejszy). Nie jest to regułą, dlatego na przykład na konkursach algorytmicznych uczestnicy często na samym początku puszczają testerce jakiś spreparowany test, aby sprawdzić, który typ danych działa najszybciej. Czasami jest to double, czasami long double, różnie z tym bywa.

No i jeszcze pozostała jedna kwestia, skoro już się tak czepiam detali ;) Chodzi mianowicie o return 0; Tak naprawdę nie wiemy, czy 0 oznacza na danym systemie bezbłędnie wykonanie (a o to nam chodzi), więc bardziej "poprawnym" jest return EXIT_SUCCESS; (potrzebna jest biblioteka cstdlib). Ale to już naprawdę mało istotny szczegół.
ODPOWIEDZ