• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z wartością 0 (powtorzenie posta, spowodu zablokowania poprzedniego)

Object Storage Arubacloud
0 głosów
155 wizyt
pytanie zadane 23 października 2017 w C i C++ przez Hadamalush Obywatel (1,880 p.)
otagowane ponownie 23 października 2017 przez criss

Witam. Po uruchomieniu poniższego kodu ,na ekranie wyswietla sie dwie wartosci dla zmiennych xr i ry, po wcisnieciu litery "d" wartosci ry dążą do 0 ,a rx do 1. Gdy ry ma sie równać zero pojawia się dziwna wartość 1.37.. co zrobić ,aby pojawiało się 0. Proszę o pomoc.

link do poprzedniego posta:

https://forum.pasja-informatyki.pl/296202/problem-dla-wartosci-0#c296217

Wstawiam post od nowa ,ponieważ tamten został zablokowany. Kodu ja nie pisalem tylko moj niewidomy brat i prosił ,by to wstawić ,trochę cieżko pisać czytelny kod nie widząc. Również przeczytałem kod i jeszcze ja sie moge przyczepic tego ,ze ortografii nie ma. Chcecie to pomozcie. Poprawił kod (jego zdaniem) :

#include <iostream>
#include <windows.h>

using namespace std;

struct sobiekty {
    double x;
    double y;
    double rx;
    double ry;
    double predkoscr;
    sobiekty() {}
    bool rotacja_lewo();
    bool rotacja_prawo();

    virtual int przesun() {}
    virtual int akt() {}
};

class cshrit : public sobiekty {
public:

    cshrit() {
        rx = 0;
        ry = -1;
        predkoscr = 0.1;
    }

    int przesun() {
        char znak;
        cout << "wspolzendne to:" << endl;
        cout << "rx= " << rx << " ry= " << ry << endl;

        cin >> znak;
        if (znak == 'a') {
            rotacja_lewo();
            cout << "rx= " << rx << " ry= " << ry << endl;
        }
        if (znak == 'd') {
            rotacja_prawo();
            cout << "rx= " << rx << " ry= " << ry << endl;
        }
        /*if(znak=='q')
        break;*/

    }

    int akt() {
        if (rx > 1)
            rx = rx - 2 * predkoscr;
        if (rx < -1)
            rx = rx + 2 * predkoscr;
        if (ry > 1)
            ry = ry - 2 * predkoscr;
        if (ry < -1)
            ry = ry + 2 * predkoscr;

    }

};

bool sobiekty::rotacja_lewo() {

    if (rx >= 0 && ry < 0) {
        rx = rx - predkoscr;
        ry = ry - predkoscr;
    }
    if (rx >= 0 && ry >= 0) {
        rx = rx + predkoscr;
        ry = ry - predkoscr;
    }
    if (rx < 0 && ry >= 0) {
        rx = rx + predkoscr;
        ry = ry + predkoscr;
    }
    if (rx < 0 && ry < 0) {
        rx = rx - predkoscr;
        ry = ry + predkoscr;
    }
    return true;
}

bool sobiekty::rotacja_prawo() {

    /*
    if(rx>=0 && ry <0)
    {
    rx=rx+predkoscr;
    ry=ry+predkoscr;
    }
    if(rx >=0 && ry >=0)
    {
    rx=rx-predkoscr;
    ry=ry+predkoscr;
    }
    if(rx <0 && ry >=0)
    {
    rx=rx-predkoscr;
    ry=ry-predkoscr;
    }
    if(rx <0 && ry <0)
    {
    rx=rx+predkoscr;
    ry=ry-predkoscr;
    }
    return true;
    */
    if (rx > 0 && ry < 0) {
        rx = rx + predkoscr;
        ry = ry + predkoscr;
    }
    if (rx > 0 && ry > 0) {
        rx = rx - predkoscr;
        ry = ry + predkoscr;
    }
    if (rx < 0 && ry > 0) {
        rx = rx - predkoscr;
        ry = ry - predkoscr;
    }
    if (rx < 0 && ry < 0) {
        rx = rx + predkoscr;
        ry = ry - predkoscr;
    }
    if (rx == 0 && ry == -1) {
        rx = rx + predkoscr;
        ry = ry + predkoscr;
    }
    if (rx == 1 && ry == 0) {
        rx = rx - predkoscr;
        ry = ry + predkoscr;
    }
    if (rx == 0 && ry == 1) {
        rx = rx - predkoscr;
        ry = ry - predkoscr;
    }
    if (rx == -1 && ry == 0) {
        rx = rx + predkoscr;
        ry = ry - predkoscr;
    }
}

int main() {
    Sleep(10);
    sobiekty * a = new cshrit();
    for (;;) {
        a->przesun();
    }

    return 0;
}

1 odpowiedź

0 głosów
odpowiedź 24 października 2017 przez j23 Mędrzec (194,920 p.)

Gdy ry ma sie równać zero pojawia się dziwna wartość 1.37...

Witaj w świecie kodowania zmiennoprzecinkowego :) Ta dziwna wartość to po prostu efekt niedokładności wspomnianego kodowania. Co możesz zrobić? Możesz użyć manipulatora std::fixed. Możesz sprawdzać, czy wartość zmiennej jest mniejsza lub równa wartości std::numeric_limits<double>::epsilon(). Jeśli jest jest, wyświetlasz wartość zero.

Podobne pytania

0 głosów
1 odpowiedź 160 wizyt
pytanie zadane 2 stycznia 2018 w Systemy operacyjne, programy przez Karol1020 Nowicjusz (130 p.)
0 głosów
1 odpowiedź 401 wizyt

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...