Funkcja typu bool

0

Witam

Jestem początkującym programistą C++. Uczę się z J. Grębosz "Symfonia C++. Wydanie trzecie". IDE Qt 4.

Moje pytanie brzmi: dlaczego funkcja "jakas_funckja()" zwraca mi zawsze true ?


#include <iostream>

using namespace std;
void suma(int a, int b, int *wynik);
void suma_wartosci_tablicy(int rozmiar, int tab[], int *wynik);
bool jakas_funkcja(double *wynik, double a = 1.3, double b = 4.5);

int main(int argc, char *argv[])
{

    const int rozmiar = 10;
    int tab[rozmiar] = { 1, 4, 5, 6, 7, 10, 200, 90, 78, 90 };

    int c;
    int suma_wartosci;
    bool v;
    double z;

    suma(5,6, &c);
    suma_wartosci_tablicy(rozmiar, tab, &suma_wartosci);

    cout << c << endl;
    cout << suma_wartosci << endl;

    v = jakas_funkcja(&z);
    cout << "Domniemane: Return code: " << v << " ; wynik = " << z << endl;
    v = jakas_funkcja(&z, 1 , 2);
    cout << "Wlasne: Return code: " << v << " ; wynik = " << z << endl;

}

bool jakas_funkcja(double *wynik, double a, double b ) {
    if((a+b) == 5.8)
    {
        *wynik = 5.8;
        return false;
    }
    else
    {
        *wynik = a+b;
        return true;
    }
}

void suma(int a, int b, int *wynik ) {

    *wynik = a + b;

}

void suma_wartosci_tablicy(int rozmiar, int tab[], int *wynik) {

    *wynik = 0;
    for(int i = 0; i < rozmiar; i++)
        *wynik += tab[i];

}

Jeśli funkcja jakas_funkcja() użyje argumentów domniemanych chce żeby mi zwróciła FALSE jeśli nie to TRUE.

pozdrawiam
daw

0

Optymistycznie zakładasz, że 1.3+4.5=5.8

0

Źle porównujesz zmienne typu double.Pogóglaj za "porównywanie typów zmiennoprzecinkowych c++",chociaż Grębosz powinien o tym wspominać

0

ok. Teraz działa co nie znaczy że zawsze będzie działać.
Więcej na ten temat:
http://www.cygnus-software.co[...]ingfloats/comparingfloats.htm
http://www.cplusplus.com/forum/articles/3827/
Funkcja bool AlmostEqual2sComplement(float A, float B, int maxUlps) z Google C++ Test FrameWork.

Użyłem "prostego porównania" liczb typu double z stronki: http://www.java2s.com/Tutoria[...]paredoublebaseonprecision.htm


#include <iostream>
#include <cmath>

using namespace std;
void suma(int a, int b, int *wynik);
void suma_wartosci_tablicy(int rozmiar, int tab[], int *wynik);
bool jakas_funkcja(double *wynik, double a = 1.3, double b = 4.5);
bool doubleEquals(double left, double right, double epsilon);

int main(int argc, char *argv[])
{

    const int rozmiar = 10;
    int tab[rozmiar] = { 1, 4, 5, 6, 7, 10, 200, 90, 78, 90 };

    int c;
    int suma_wartosci;
    bool v;
    double z;

    suma(5,6, &c);
    suma_wartosci_tablicy(rozmiar, tab, &suma_wartosci);
    cout << c << endl;
    cout << suma_wartosci << endl;

    v = jakas_funkcja(&z);
    cout << "Domniemane: Return code: " << v << " ; wynik = " << z << endl;
    v = jakas_funkcja(&z, 1 , 2);
    cout << "Wlasne: Return code: " << v << " ; wynik = " << z << endl;

}

bool doubleEquals(double left, double right, double epsilon) {
  return (fabs(left - right) < epsilon);
}

bool jakas_funkcja(double *wynik, double a, double b ) {
    double left = a + b;
    double right = 5.8;
    const double EPS = 0.000001;

    if(doubleEquals(left, right, EPS))
    {
        *wynik = right;
        return false;
    }
    else
    {
        *wynik = a+b;
        return true;
    }
}

void suma(int a, int b, int *wynik ) {

    *wynik = a + b;

}

void suma_wartosci_tablicy(int rozmiar, int tab[], int *wynik) {

    *wynik = 0;
    for(int i = 0; i < rozmiar; i++)
        *wynik += tab[i];

}

pozdrawiam
daw

0

Proszę zmienić temat tego tematu na "Porównywanie liczb zmiennoprzecinkowych" oraz skasować ten post

dziękuje.

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