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

Połowienie przedziałów i makra

Object Storage Arubacloud
0 głosów
630 wizyt
pytanie zadane 14 maja 2020 w C i C++ przez Altair Nowicjusz (140 p.)

Przy makrze dokładność pojawia się error: expected declaration specifies or '...' before numeric specifies. Problem pojawia się również gdy jako przedział podam np. 1.0 5.0 gdzie powinno zwrócić c=3,05 jednak program nic nie zwraca ma ktoś pomysł jak mógłbym go poprawic?

#include <stdio.h>


#define FUNKCJA(x)  (x)*(x)-2*(x)-3

#define DOKLADNOSC 0.1



double polowienie_przedzialow(double a, double b, DOKLADNOSC)
{
    double srodek;
	double c;

	if(FUNKCJA(a)==0.0)return a;
	else if(FUNKCJA(b)==0.0)return b;
	else if((FUNKCJA(a)>0 && FUNKCJA(b)>0) || (FUNKCJA(a)<0 && FUNKCJA(b)<0))
        printf("W podanym przedziale pierwiastek nie musi istniec.");
    else{

	while(b-a > DOKLADNOSC)
	{
		srodek = (a+b)/2;

		if(FUNKCJA(srodek) == 0.0) //jesli miejsce zerowe jest w srodku
			return srodek;

		if(FUNKCJA(a)*FUNKCJA(srodek)<0)
			b = srodek;
		else
			a = srodek;
	}
	c=(a+b)/2;
	printf("%lf",c);
    }

    return 0;
}



int main()
{
  double a;
  double b;

  printf("Podaj dwie liczby(lewy i prway koniec przedzialu): ");
  scanf("%lf %lf",a,b);


	polowienie_przedzialow(a,b, DOKLADNOSC);


    return 0;
}

 

komentarz 14 maja 2020 przez TOWaD Mądrala (6,000 p.)
edycja 15 maja 2020 przez TOWaD

Teoretycznie znak "==" dla double nie istnieje. A napewno nie dla metody połowienia przedziałów wyszukania miejsc zerowych funkcji

// ale jak już się jak Ci na tym operatorze zależy to
//funkcja long long
long long eps (double f_value, int eps){

return f_value*eps;}

// i wywołanie w main

if(eps(FUNKCJA(a),10)==0)

 

komentarz 15 maja 2020 przez tkz Nałogowiec (42,000 p.)
W c++ nie istnieje znak równości dla typu POD?
komentarz 15 maja 2020 przez TOWaD Mądrala (6,000 p.)
Pewnie zależy jaki POD. Wystarczy wykonać parę operacji na liczbach niewymiernych lub wyniernych ułamiem  okresowym i wadomo dlaczego nie stosuje się porównania dla typu double.

Samo połowienie przedziałów do wyznaczania miejsc zerowych z definicji jest metodą przybliżoną. Więc jak można mówić o znaku równości (tu operatorze porównywania).
komentarz 16 maja 2020 przez tkz Nałogowiec (42,000 p.)
Twoje twierdzenie było inne, że nie istnieje teoretycznie. Problemu nie stanowi brak znaku ==, ale sama charakterystyka liczb zmiennoprzecinkowych.
komentarz 16 maja 2020 przez TOWaD Mądrala (6,000 p.)
edycja 16 maja 2020 przez TOWaD
W takim przypadku bym napisał "nie istneje" operator "=="."Teoretycznie" zmienia sens zdania. Ale mniesza o większość. Bardzo dobrze wiesz ze dla double stosuje się |a|<eps, a nie a==0.

Ale że double to POD to nie wiedziałem. Jak byś porzucił budowlę, to był wdzięczny.

1 odpowiedź

0 głosów
odpowiedź 14 maja 2020 przez j23 Mędrzec (194,920 p.)
double polowienie_przedzialow(double a, double b, DOKLADNOSC)
{
        ...
}

Co tam robi ta DOKLADNOSC w parametrach? Po co ona tam?

komentarz 15 maja 2020 przez Altair Nowicjusz (140 p.)
Takie polecenie. Funkcja ma działać na tych parametrach
komentarz 15 maja 2020 przez j23 Mędrzec (194,920 p.)

Nie możesz dać wartości liczbowej w miejscu, gdzie definiuje się parametry funkcji. Jeśli już, to tak:

double polowienie_przedzialow(double a, double b, double dokladnosc)
{
         ...
}

 

komentarz 15 maja 2020 przez Altair Nowicjusz (140 p.)

@j23, No ok rozumiem. Ale nadal mam error jak opisany wyżej przy #define DOKLADNOSC 1.0 wydaje mi się że tam i wyżej wszystko jest ok

1
komentarz 15 maja 2020 przez j23 Mędrzec (194,920 p.)
Sprawdziłem twój kod. Po poprawieniu tego, o czym pisałem, kompiluje się bez większych problemów.

Podobne pytania

0 głosów
2 odpowiedzi 541 wizyt
pytanie zadane 23 listopada 2019 w C i C++ przez Ola Piątek Nowicjusz (240 p.)
0 głosów
2 odpowiedzi 521 wizyt
pytanie zadane 2 października 2015 w C i C++ przez baran860 Nowicjusz (200 p.)
+1 głos
1 odpowiedź 550 wizyt
pytanie zadane 14 czerwca 2018 w C i C++ przez Mithriandil Początkujący (250 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...