Zaokrąglanie liczby rzeczywistej w granicy błędu względnego
Spróbujemy stworzyć program obliczający kolejne zaokrąglenia podanej liczby, za każdym razem do mniejszej liczby miejsc po przecinku. Warunkiem zakończenia operacji będzie przekroczenie ustalonej wartości błędu względnegobłąd względnybłędu względnego. W ten sposób otrzymamy największe możliwe zaokrąglenie przy ustalonych warunkach. Takie rozwiązanie jest pożądane w sytuacji, gdy operujemy mniej dokładnymi liczbami, jednak chcemy zminimalizować błąd do ustalonego stopnia.
Specyfikacja:
Dane:
x – wartość przekazana do zaokrąglenia przez użytkownika; liczba rzeczywista z przedziału (0, 1), posiadająca 7 cyfr po przecinku
bladKrytyczny – wartość błędu względnego, po której osiągnięciu proces zaokrąglania zostanie przerwany; liczba rzeczywista z przedziału (0, 100)
Wynik:
Program na standardowym wyjściu wypisuje wyznaczone zaokrąglenie podanej liczby.
Rozważmy próg błędu względnego równy 2%. Liczba 0,511 może zostać zaokrąglona do 0,51 – przez co uzyskamy błąd względny 0,1957%.
Ważne!
Zaokrągliliśmy wynik dzielenia.
Liczbę 0,51 możemy dalej zaokrąglić do 0,5, co w stosunku do oryginalnej wartości daje nam błąd 2,153%, który przekracza wartość krytyczną. Z czego wynika, że zaokrąglenie mieszczące się w ustalonym błędzie względnym wynosi 0,51.
Dobierzmy odpowiednie biblioteki. Wykorzystamy podstawowe operacje matematyczne, jak zaokrąglanie i wyliczanie wartości bezwzględnej, dlatego niezbędna będzie biblioteka <cmath>. Będziemy pracować na niewielkich liczbach z przedziału (0, 1) mających siedem cyfr po przecinku. Wyniki należy wyświetlać z odpowiednią precyzją, do czego posłuży nam funkcja setprecision z biblioteki <iomanip>. Pełny zbiór bibliotek wygląda następująco:
Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny.
Linia 2. kratka include otwórz nawias ostrokątny cmath zamknij nawias ostrokątny.
Linia 3. kratka include otwórz nawias ostrokątny iomanip zamknij nawias ostrokątny.
Skorzystamy również z przestrzeni nazw std.
Linia 1. using namespace std średnik.
Kolejnym krokiem jest napisanie funkcji odpowiedzialnej za zaokrąglanie podanej liczby. Będzie ona zawierać dwa argumenty. Jeden to wspomniana liczba, drugi – wartość określająca, do ilu miejsc po przecinku będziemy zaokrąglać. Wykorzystamy funkcję pow podnoszącą wartość do podanej potęgi. Jako wykładnik posłuży nam pożądana liczba cyfr po przecinku po operacji zaokrąglenia. Jeżeli chcemy uzyskać jedną cyfrę po przecinku, wówczas niezbędne jest pomnożenie pierwotnej wartości przez 10Indeks górny 11. Po przeprowadzeniu tego mnożenia, zaokrąglamy otrzymaną liczbę, a następnie dzielimy ją przez 10Indeks górny 11. Rezultatem tej operacji będzie gotowa, zaokrąglona liczba z jedną cyfrą po przecinku.
Zadeklarujmy teraz niezbędne zmienne. Należą do nich opisane w specyfikacji x oraz bladKrytyczny, a także:
xZaokraglony – zaokrąglona liczba,
bladBezwzgledny – wyliczona wartość błędu bezwzględnego,
bladWzgledny – wyliczona wartość błędu względnego.
Linia 1. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. double x przecinek xZaokraglony przecinek bladKrytyczny przecinek bladBezwzgledny przecinek bladWzgledny średnik.
Linia 3. zamknij nawias klamrowy.
Zmienne x oraz bladKrytyczny pobierzemy od użytkownika. Pamiętajmy o warunkach, które powinna spełnić liczba przekazana do zaokrąglenia — ma to być liczba rzeczywista z przedziału (0, 1), posiadająca 7 cyfr po przecinku.
Linia 1. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. double x przecinek xZaokraglony przecinek bladKrytyczny przecinek bladBezwzgledny przecinek bladWzgledny średnik.
Linia 4. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Podaj wartość liczby do zaokrąglenia z przedziału otwórz nawias okrągły 0 średnik 1 zamknij nawias okrągły oraz zawierająca 7 cyfr po przecinku dwukropek cudzysłów średnik.
Linia 5. cin zamknij nawias ostrokątny zamknij nawias ostrokątny x średnik.
Linia 6. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Podaj krytyczną wartość błędu dwukropek cudzysłów średnik.
Linia 7. cin zamknij nawias ostrokątny zamknij nawias ostrokątny bladKrytyczny średnik.
Linia 8. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
Linia 9. zamknij nawias klamrowy.
Po pobraniu niezbędnych informacji, możemy przejść do zaokrąglania liczby. Cały proces zrealizujemy za pomocą pętli for. W każdym kolejnym wykonaniu pętli zaokrąglona liczba będzie miała jedną cyfrę po przecinku mniej. Aby tego dokonać, jako drugi argument funkcji zaokraglenie wykorzystamy wartość 7‑i. Następnie obliczymy wartości błędu bezwzględnego i względnego. Przydatna będzie tu funkcja fabs zwracająca wartość bezwzględną liczby.
Linia 1. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny znak równości 7 średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. xZaokraglony znak równości zaokraglenie otwórz nawias okrągły x przecinek 7 minus i zamknij nawias okrągły średnik.
Linia 3. bladBezwzgledny znak równości fabs otwórz nawias okrągły x minus xZaokraglony zamknij nawias okrągły średnik.
Linia 4. bladWzgledny znak równości otwórz nawias okrągły bladBezwzgledny prawy ukośnik x zamknij nawias okrągły asterysk 100 średnik.
Linia 5. zamknij nawias klamrowy.
Wciąż jednak brakuje nam warunku zatrzymania pętli w związku z przekroczeniem ustalonej wartości błędu. Zrealizujemy go za pomocą instrukcji if. Pamiętajmy, że na końcu działania programu wypisana ma zostać ostatnia wartość zaokrąglenia, dla której nie przekroczono warunku krytycznego. Dlatego w wypadku spełnienia warunku pętli nadpiszemy aktualną wartość zaokrąglenia poprzednią wartością.
Linia 1. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny znak równości 7 średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. xZaokraglony znak równości zaokraglenie otwórz nawias okrągły x przecinek 7 minus i zamknij nawias okrągły średnik.
Linia 3. bladBezwzgledny znak równości fabs otwórz nawias okrągły x minus xZaokraglony zamknij nawias okrągły średnik.
Linia 4. bladWzgledny znak równości otwórz nawias okrągły bladBezwzgledny prawy ukośnik x zamknij nawias okrągły asterysk 100 średnik.
Linia 6. if otwórz nawias okrągły bladWzgledny zamknij nawias ostrokątny bladKrytyczny zamknij nawias okrągły otwórz nawias klamrowy.
Linia 7. xZaokraglony znak równości zaokraglenie otwórz nawias okrągły x przecinek 8 minus i zamknij nawias okrągły średnik.
Linia 8. break średnik.
Linia 9. zamknij nawias klamrowy.
Linia 10. zamknij nawias klamrowy.
Teraz pozostaje już wyłącznie wypisać końcowy wynik, pamiętając o wymogu odpowiedniej precyzji. Cały program prezentuje się następująco:
Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny.
Linia 2. kratka include otwórz nawias ostrokątny cmath zamknij nawias ostrokątny.
Linia 3. kratka include otwórz nawias ostrokątny iomanip zamknij nawias ostrokątny.
Linia 4. using namespace std średnik.
Linia 6. double zaokraglenie otwórz nawias okrągły double liczba przecinek int poPrzecinku zamknij nawias okrągły otwórz nawias klamrowy.
Linia 7. return round otwórz nawias okrągły liczba asterysk otwórz nawias okrągły pow otwórz nawias okrągły 10 przecinek poPrzecinku zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły prawy ukośnik otwórz nawias okrągły pow otwórz nawias okrągły 10 przecinek poPrzecinku zamknij nawias okrągły zamknij nawias okrągły średnik.
Linia 8. zamknij nawias klamrowy.
Linia 10. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 11. double x przecinek xZaokraglony przecinek bladKrytyczny przecinek bladBezwzgledny przecinek bladWzgledny średnik.
Linia 13. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Podaj wartość liczby do zaokrąglenia z przedziału otwórz nawias okrągły 0 średnik 1 zamknij nawias okrągły oraz zawierająca 7 cyfr po przecinku dwukropek cudzysłów średnik.
Linia 14. cin zamknij nawias ostrokątny zamknij nawias ostrokątny x średnik.
Linia 15. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Podaj krytyczną wartość błędu dwukropek cudzysłów średnik.
Linia 16. cin zamknij nawias ostrokątny zamknij nawias ostrokątny bladKrytyczny średnik.
Linia 17. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
Linia 19. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny znak równości 7 średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy.
Linia 20. xZaokraglony znak równości zaokraglenie otwórz nawias okrągły x przecinek 7 minus i zamknij nawias okrągły średnik.
Linia 21. bladBezwzgledny znak równości fabs otwórz nawias okrągły x minus xZaokraglony zamknij nawias okrągły średnik.
Linia 22. bladWzgledny znak równości otwórz nawias okrągły bladBezwzgledny prawy ukośnik x zamknij nawias okrągły asterysk 100 średnik.
Linia 24. if otwórz nawias okrągły bladWzgledny zamknij nawias ostrokątny bladKrytyczny zamknij nawias okrągły otwórz nawias klamrowy.
Linia 25. xZaokraglony znak równości zaokraglenie otwórz nawias okrągły x przecinek 8 minus i zamknij nawias okrągły średnik.
Linia 26. break średnik.
Linia 27. zamknij nawias klamrowy.
Linia 28. zamknij nawias klamrowy.
Linia 30. cout otwórz nawias ostrokątny otwórz nawias ostrokątny setprecision otwórz nawias okrągły 8 zamknij nawias okrągły otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Ustalona wartość błędu została przekroczona kropka Zaokrąglenie liczby wynosi dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny xZaokraglony średnik.
Linia 32. return 0 średnik.
Linia 33. zamknij nawias klamrowy.
Dla danych z omówionego wcześniej przykładu (x wynoszące 0,511, bladKrytyczny równy 2%) otrzymujemy wynik 0.51, czyli taki, jakiego się spodziewaliśmy.
Dla danych: x równe 0,1234567, bladKrytyczny wynoszący 3%, otrzymujemy wynik 0,12 – jest to zaokrąglenie z błędem względnym wynoszącym około 2.7%. Gdybyśmy liczbę zaokrąglili do 0,1, próg błędu zostałby przekroczony.
Słownik
błąd bezwzględny
błąd bezwzględny
wyraża bezwzględną różnicę pomiędzy wartością zmierzoną a dokładną; obliczamy go zgodnie ze wzorem:
gdzie to dokładna wartość, oznacza zmierzoną wartość, a – błąd bezwzględny
błąd względny
błąd względny
informuje, o ile procent różni się wartość zmierzona od dokładnej; obliczamy go zgodnie ze wzorem:
gdzie to dokładna wartość, oznacza zmierzoną wartość, – błąd bezwzględny, a za pomocą określamy błąd względny