Liczby rzeczywiste z dokładnością do 0.001

Liczby rzeczywiste z dokładnością do 0.001
DA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5
0

Serdecznie wszystkich witam!
No więc jestem bardzo, bardzo początkujący jeżeli chodzi o kwestię programowania, dostałem takie zadanie od pani profesor:

Napisać i uruchomić program, w którym zdefiniowane zostaną 3 funkcje
o nazwie wiekszy() wykonujące operację porównania dwóch
przekazanych do nich argumentów i zwracających 1, gdy argument
pierwszy ma większą wartość niż drugi, 2, gdy argument drugi ma
większą wartość niż pierwszy, 0, gdy argumenty są sobie równe.
Funkcje powinny działać dla argumentów będących liczbami
całkowitymi, rzeczywistymi (z dokładnością do 0.001) i łańcuchami
znaków.

Programik jakoś ogarnę ale mam problem z "ustawieniem" dokładności do 0.001. Czy ktoś z Was mógłby na przykładzie pokazać jak ogarnąć temat dokładności w tym zadaniu? Czytałem inne wypowiedzi w temacie na tym forum ale jakoś nie mogę dostosować przedstawionych tam rozwiązań do mojego programu.

Z góry dziękuję!
davepol

AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 82
PR
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Pomorskie (Stare Kabaty)
1

Musisz skorzystać z epsilona przy tak dużej precyzji.
std::numeric_limits<float>::epsilon()

DA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5
0

Jejks! Dzięki serdeczne za tak szybki odzew i konkretne informacje!

DA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5
0

No właśnie... a myślałem że to będzie takie banalne. Tym bardziej serdeczne dzięki!! :)

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
2

http://edu.i-lo.tarnow.pl/inf/utils/001_2008/0119.php
Twój epsilon w tym przypadku to 0.001.

Proxima napisał(a):

Musisz skorzystać z epsilona przy tak dużej precyzji.
std::numeric_limits<float>::epsilon()
Po co mu ta wartość? Przecież ma podaną konkretną, nie za dużą wartość epsilona.

DA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5
0

Generalnie do zadania zabrałem się tak że robię trzy funkcje (zadanie jest na przeciążanie funkcji) każda ma tą samą nazwę ale przyjmuje argumenty innego typu. Każda funkcja robi pętlę if - else if - else if i na koniec zwraca wartość (return 1 lub 2 lub 0). Czyli teraz ograniczę funkcję która przyjmuje float aby przyjmowała wartości tylko do 0.001? (według opisuje w tym artykule) To powiedział kompletny noob! :D

PR
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Pomorskie (Stare Kabaty)
1

Nie wiem co jest w tym arcie, bo można zrobić to na kilka sposobów(ale każdy sposób sprowadza sie właśnie do epsilona), ale dobrze kombinujesz.
Chodzi właśnie o ten margines błędu.

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
2
davepol napisał(a):

Czyli teraz ograniczę funkcję która przyjmuje float aby przyjmowała wartości tylko do 0.001?
Nie. Nie. Nie.

W funkcji która przyjmuje inty masz do dyspozycji wszystkie operatory <, ==, > itd. Czyli możesz zrobić

Kopiuj
if (intX == intY)

Natomiast w wersji z float nie wolno Ci używać ==

Kopiuj
if (floatX == floatY)  // NIE!!!!!!

Zamiast tego musisz używać czegoś w stylu

Kopiuj
if (abs(floatX - floatY) < 0.001)
DA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5
0

Czyli coś takiego:

Kopiuj
float wiekszy (float a, float b){

 if (abs(a - b) < 0.001) //if (abs(floatX - floatY) < 0.001)
 return 1;

 else if (abs(b - a) > 0.001)
 return 2;

 else if (abs(a - b)  0.001)
 return 0;
 
} 

Czytam że floatów nie można porównywać a w zadanku wyraźnie że mam porównać...

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
1
Kopiuj
int wiekszy (float a, float b)
{
    if (fabs(a - b) < 0.001)        // rowne   
        return 0;
    if (a < b)
        return 1;
    if (b < a)
        return 2;
} 

else nie jest wymagane w tym przypadku, bo return od razu wychodzi z funkcji

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.