Blad kompilatora?

0

Witam mam bardzo głupi problem z programem:

trafnosc=false;
cout << a[wskaznik]*d << "," << a[wskaznik+1] << endl;
b=a[wskaznik]*d;
c=a[wskaznik+1];
cout << b << "," << c << endl;
if (b==c)
{
	trafnosc=true;
}

d=1.1 , a[wskaznik] ma 1 , a a[wskaznik+1] ma 1.1;
jak dam do b i c 1.1 to działa ale jak jest tak to nie...
DLACZEGO?

0

http://ideone.com/mKFOxs

jak dla mnie coś pomieszałeś z wartością "wskaźnik"

0
 
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <string>

using namespace std;

int main()
{
    double a[3];
    double b,c,d;
    int wskaznik,koniec;
    bool trafnosc=false;
    char dzialanie[100];
    for (int i=0; i<sizeof(dzialanie)/sizeof(dzialanie[0]); i++)
    {
        dzialanie[i]=' ';
    }
    d=0;
    cin >> a[0];
    cin >> a[1];
    cin >> a[2];
    wskaznik=0;
    koniec=0;
    if (a[0]<a[1])
    {
        dzialanie[0]='+';
    }
    else
    {
        dzialanie[0]='-';
    }
    while ((trafnosc==false))
    {
        //
        for (int i=0; i<=koniec; i++)
        {
            if ((dzialanie[i]=='+') or (dzialanie[i]=='-'))
            {
                d=a[1]-a[0];
                cout << d << endl;
                for (wskaznik=0; wskaznik<2; wskaznik++)
                {
                    cout << endl << wskaznik << endl;
                    if ( a[wskaznik]+d==a[wskaznik+1] )
                    {
                        trafnosc=true;
                    }
                    else
                    {
                        trafnosc=false;

                    }
                }
            }
            else if (dzialanie[i]=='*')
            {
                cout << endl << a[0] << "," << a[1] << "," << a[2] << endl;
                d=(a[2]-a[1])/(a[1]-a[0]);
                for (wskaznik=0; wskaznik<2; wskaznik++)
                {
                    cout << d << "," << wskaznik << endl;
                    if ((a[wskaznik]*d==a[wskaznik+1]))
                    {
                        trafnosc=true;
                    }
                    else
                    {
                        trafnosc=false;
                        cout << a[wskaznik]*d << "," << a[wskaznik+1] << endl;
                        cout << d;
                        if (a[0]*d==a[1])
                        {
                            trafnosc=true;
                        }
                        system("pause");
                    }
                }
            }
            else if (dzialanie[i]=='/')
            {
                d=(a[2]-a[1])*(a[1]-a[0]);
                for (wskaznik=0; wskaznik<2; wskaznik++)
                {
                    if (a[wskaznik]/d==a[wskaznik+1])
                    {
                        trafnosc=true;
                    }
                    else
                    {
                        trafnosc=false;
                    }
                }
            }
            else
            {
                cout << "nie odnaleziono dzialania";
                trafnosc=true;
            }

        }
        cout << dzialanie;
        cout << d << endl;
        if (trafnosc==false)
        {
            _sleep(300);
            switch(dzialanie[0])
            {
            case '+':
                dzialanie[0]='*';
                break;

            case '-':
                dzialanie[0]='/';
                break;

                //...
            case '*':
                //jakiś kod
                break;

            default:
                //jakiś kod
            break;
            }
        }



    }
    d=abs(d);
    system("pause");
    system("cls");
    for (int i=0; i<=koniec; i++)
    {
        cout << "x" << dzialanie[i] << d << endl;
    }
    system("pause");
    return 0;
}



Cały program... a teraz czemu nadal jest złe?
Odkryłem, że to coś z d bo jak zmieniłem d na 1.1(w sumie to przy moich danych to to samo) to działa ale 1.1 nie będzie zawsze.
Dokładniej to nie działa poprawnie mnożenie i dzielenie.

0

Kiedy wpisze 1 1.1(11.1) 1.21(1.11.1) to wykonuje:

d=(a[2]-a[1])/(a[1]-a[0]); 

czyli 1.21-1.1/1.1-1=1.1 czyli d ma 1.1.. ale czemu jak ma tak to nie działa a jak dam ręcznie 1.1 to tak?

0

Zrobiłem tak... w punkcie gdzie się myli wypisuje mi:

cout << d << "," << a[wskaznik]*d << "," << a[wskaznik+1] << endl;

I pisze mi:

1.1,1.1,1.1

a za drugim razem:

1.1,1.21,1.21

czyli się zgadza ale if tego nie rozumie...

0

owszem w a[0]=d jest 1*1.1 a w a[1] jest 1.1 to czemu nie są równe?

3

Kodowanie uzyte do zapisu liczb zmiennoprzecinkowych (http://pl.wikipedia.org/wiki/IEEE_754) ma ograniczona precyzje.
Liczby zmiennoprzecinkowe trzeba porownywac z epsilonem (jesli ktorys z operandow porownaniu, ma wartosc "wyliczana" a nie stala), przyklad:

if(abs(a-b) < FLT_EPSILON) {
  // some code here
}
0

Wygląda to tak, że chcę wpisać 3 liczby i ma wypisać ile muszę pomnożyć pierwszą aby była druga.
jak daje 1 1.1 1.21 to wychodzi 1.1 program wypisuje to i się zapętla bo dla niego 1.1 nie równa się 1.1 jak to naprawić?
Nie jestem akurat w tym dobry... Może jakiś działający przykład?

0

tak(a dokładniej to tworzy cały wzór tylko jeszcze nie działa) i tylko przy ułamkach nie działa...
a jak zrobić, żeby działało to nadal nie ogarniam...

0

czyli nie mogę zrobić, żeby sprawdzał ile trzeba pomnożyć?

0

a czy jak bym przy dzieleniu dał *100 i nie było by przecinka a na końcu bym dał /100 to by dało radę?
tylko w warunku nie działa ten ułamek przecież

0

Elles częściowo miałeś rację ale nie do tego, że to nie wykonalne... A poza tym to ma robić duże równania więc po chwili twoja wersja odpada...
Owszem zapis bitowy jest zaokrąglany ale mój nauczyciel znalazł sposób i już działa(chwała nauczycielom informy).
Jak dam:

 
if ((a[wskaznik]*d)-a[wskaznik+1]<0.0000001)

Zamiast:

if (a[wskaznik]*d==a[wskaznik+1])

to jest super...
Ustawianie precyzji... nie ogarniam ale działa XD
A w sumie to noname to pierwszy odkrył tylko nie zauważyłem...

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