Liczby rzeczywiste z dokładnością do 0.001

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

1

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

0

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

0

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

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.

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

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.

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ć

if (intX == intY)

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

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

Zamiast tego musisz używać czegoś w stylu

if (abs(floatX - floatY) < 0.001)
0

Czyli coś takiego:

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ć...

1
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

1 użytkowników online, w tym zalogowanych: 0, gości: 1