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

question-closed funkcja zawsze zwraca false CPP

0 głosów
55 wizyt
pytanie zadane 9 marca w C i C++ przez Ender_ Początkujący (370 p.)
zamknięte 10 marca przez Ender_

Mam sobie taką funkcję i nieważne co wpisze w argumenty zwraca false.

Funkcja sprawdza czy na okręgu o środku w punkcie (a,b) i promieniu r jest punkt (a,b)

bool check_on_circle_board(float x, float y, float a, float b, float r){
    bool check=false;
    if(pow(x-a, 2)+pow(y-b, 2)==pow(r,2)){
        check=true;
        cout<<"udane";
    }
    return check;
}

Dla ułatwienia podaje argumenty które powinny dać true: (256, 8, 200, 200, 200)

komentarz zamknięcia: Problem rozwiązany ostatecznie przeze mnie, problem z biblioteką a nie kodem.

3 odpowiedzi

0 głosów
odpowiedź 9 marca przez DeBos123 Nałogowiec (36,010 p.)

Sprawdziłem kod na stronie: cpp.sh i zwraca true.

Kod:

#include <iostream>
#include <string>
#include <cmath>

bool check_on_circle_board(float x, float y, float a, float b, float r){
    bool check=false;
    if(pow(x-a, 2)+pow(y-b, 2)==pow(r,2)){
        check=true;
        std::cout<<"udane";
    }
    return check;
}

int main()
{
    check_on_circle_board(256,8,200,200,200);
}

 

komentarz 9 marca przez Ender_ Początkujący (370 p.)
Faktycznie, jak wklejam mój kod na strone to działa a u mnie w codeblocks nie. Masz pomysł dlaczego?
komentarz 9 marca przez DeBos123 Nałogowiec (36,010 p.)
Pokaż cały kod, napisz czy dostajesz jakieś błędy/ostrzeżenia.
komentarz 10 marca przez jankustosz1 Pasjonat (19,870 p.)

@Ender_,

Zamień float na double, może to coś pomoże. Floty są dosyć niedokładne i lubią się psuć.

komentarz 10 marca przez Ender_ Początkujący (370 p.)
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

struct pos{
    int x;
    int y;
};

struct point{
    pos pozycja;
    bool on_circle = false;
};

bool check_on_circle_board(float x, float y, float a, float b, float r){
    bool check=false;
    if(pow(256-a, 2)+pow(8-b, 2)==pow(200,2)){
        check=true;
        cout<<"udane";
    }
    return check;
}

int main(){

    ifstream f_punkty;
    f_punkty.open("Dane_PR2/punkty.txt");
    int liczba;

    int Oxy = 200;

    pos kwadrat[2];
    kwadrat[0].x = 0;
    kwadrat[0].y = 0;
    kwadrat[1].x = 400;
    kwadrat[1].y = 400;

    int r = 200;


    point points[10000];
    for(int i=1; i<=10000; i++){
        f_punkty>>points[i-1].pozycja.x;
        f_punkty>>points[i-1].pozycja.y;
        points[i-1].on_circle = check_on_circle_board(points[i-1].pozycja.x, points[i-1].pozycja.y, Oxy, Oxy, r);
    }



return 0;
}

Żadnych błędów lub ostrzeżeń + na stronkę którą podesłałeś wkleiłem cały kod i działało.

komentarz 10 marca przez jankustosz1 Pasjonat (19,870 p.)
Obstawiam że odpalasz zły projekt
komentarz 10 marca przez Ender_ Początkujący (370 p.)
@januszkustosz1 Niestety zamiana nie pomogła :(
komentarz 10 marca przez DeBos123 Nałogowiec (36,010 p.)
Spróbuj może jeszcze raz stworzyć projekt.
komentarz 10 marca przez Ender_ Początkujący (370 p.)
Niestety po stworzeniu projektu na nowo dalej nie działa.

EDIT: dodam że mam tylko jeden projekt odpalony.
komentarz 10 marca przez DeBos123 Nałogowiec (36,010 p.)

Może spróbuj dodać to:

cout<<"x:"<<points[i-1].pozycja.x<<" y:"<<points[i-1].pozycja.y<<endl;

po linii 46 i sprawdź czy dobrze są wczytywane punkty z pliku.

komentarz 10 marca przez Ender_ Początkujący (370 p.)
Niżej już jest opisane rozwiązanie problemu :)
0 głosów
odpowiedź 10 marca przez Ender_ Początkujący (370 p.)

Troche pokombinowałem i znalazłem trop, ale niestety wciąż niewiem jak to naprawić.
Generalnie samo coś takiego nie działa więc gdzieś tu jest problem:

if(pow(256-200, 2)+pow(8-200, 2)==pow(200,2)){
     cout<<"udane";
}

 

0 głosów
odpowiedź 10 marca przez Ender_ Początkujący (370 p.)

Dobra wiem o co chodzi ale niech ktos mi wyjasni jakim cudem

pow(200,2)

Daje mi wynik 39999 a nie 40000

komentarz 10 marca przez DeBos123 Nałogowiec (36,010 p.)
Tu masz opisany ten problem: https://stackoverflow.com/questions/17122496/wrong-output-by-power-function-c

Nie mam pojęcia czemu na stronie kod działa, a u ciebie nie.
komentarz 10 marca przez Ender_ Początkujący (370 p.)

@DeBos123, Dzieki wyprzedziłeś mnie o 23 sekundy XD.
W każdym razie znalazłem odpowiedź na moje pytanie tutaj:
https://forum.pasja-informatyki.pl/29244/dlaczego-komenda-pow-podaje-zly-wynik-przy-podstawie-5
Jak by ktoś miał kiedyś z tym problem to polecam użyć funkcji round() do zaokrąglenia liczb w górę ponieważ pow() często jest niedokładne i zwraca liczbę o jakieś tam części mniejszą od oczekiwanej przez co trzeba zaokrąglać w górę.

round(pow(200,2))

PS. Nie wiem jakim cudem taki błąd przeszedł do takiej biblioteki (najwyraźniej nie jestem jedyną osobą z tym problemem)

komentarz 10 marca przez Cook Nowicjusz (100 p.)
PS. Nie wiem jakim cudem taki błąd przeszedł do takiej biblioteki (najwyraźniej nie jestem jedyną osobą z tym problemem)

To nie jest problem z biblioteką tylko z reprezentacją liczb zmiennoprzecinkowych a także z sposobem w jaki je porównujesz. Poczytaj sobie: https://floating-point-gui.de/errors/comparison/

Podobne pytania

0 głosów
1 odpowiedź 180 wizyt
pytanie zadane 12 kwietnia 2016 w C i C++ przez DaaJay Początkujący (300 p.)
+1 głos
1 odpowiedź 87 wizyt
0 głosów
1 odpowiedź 68 wizyt
pytanie zadane 16 maja 2016 w C i C++ przez RycerzAndromedy Użytkownik (670 p.)
Porady nie od parady
Pytania na temat serwisu SPOJ należy zadawać z odpowiednią kategorią dotyczącą tej strony.SPOJ

66,494 zapytań

113,266 odpowiedzi

239,865 komentarzy

46,630 pasjonatów

Przeglądających: 133
Pasjonatów: 0 Gości: 133

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...