1 / 3
May 2009

Witam!
Mam taki niecodzienny problem z funkcją pow z biblioteki math.h który zdarzył mi się przy okazji robienia zadania 429. Simple Numbers Conversion (choć przyznam był to nie pierwszy raz kiedy taki problem mi się zdarzył). Otóż problem w tym że funkcja ta użyta z dwoma dodatnimi argumentami jakoś źle liczy te potęgi.

 if(c=="0") return 0; else{
      int liczba=0;
      for(int i=0;i<c.length();++i){
              liczba=liczba+(wartosc(c[c.length()-i-1])*pot(p,i));
              }
      return liczba;}

to jest fragment moje rozwiązania tego zadania (dokładniej funkcji służącej do konwersji danej liczby z danej podstawy do liczby o podstawie 10) gdzie pot jest prostą funkcją którą napisałem do liczenia potęg liczb naturalnych.

int pot(int a, int b){
    if(b==0) return 1; else return (a*pot(a,b-1));
    }

I jeżeli zastąpię funkcję pot funkcją pow to np dla danych wejściowych przykładowych podanych w treści samego zadania

ABC 15 10

program zwraca wynik 2426 choć powinien zwrócić 2427. Gdy jest moja funkcja pot to jest wszystko ok. Wie ktoś może dlaczego z funkcją pow nie działa? Nie potrafię podać konkretnego przykładu kiedy funkcja pow liczy źle potęgi, ale jak już wspominałem już kiedyś miałem parę razy kłopoty z tą funkcją gdy miała 2 argumenty będące liczbami naturalnymi dodatnimi...

  • created

    May '09
  • last reply

    Jun '09
  • 2

    replies

  • 573

    views

  • 3

    users

pow z math.h liczy potegi jako rozwiniecie w szereg taylora w zwiazku z czym zwraca double i pewnie tutaj tkwi problem.

1 month later

Zadeklaruj sobie zmienna globalna epsilon = 0.0000000000000001; i przed zamiana double na int dodawaj to epsilon do liczby. Błąd zaokrąglenia powinien zniknąć 8)