C++ problem z POW: domain error


(Trance) #1

Proszę o pomoc, mianowicie muszę w pewnym programie użyć funkcji pow (biblioteka math.h) aby znaleźć wartość pierwiastka pewnej liczby (stopień pierwiastka jest większy niż 2).

W wielkim uproszczeniu mam coś takiego:

int ile;

int liczba;

int wynik;

wynik=pow(liczba,(1/ile);

Program kompiluje sie i uruchamia ale przy próbie uruchomienia ostatniego polecenia (używam C++ Builder 6 Personal) wywala mi okienko z błędem "POW: domain error" . Przyjaciel Google :wink: powiedział że to może być problem z typem zmiennych jednak próbowałem chyba wszystkich kombinacji i nic z tego :frowning: . Jeżeli spotkał sie ktoś czymś takim proszę o pomoc

Ewentualnie jeżeli jest jakiś inny sposób na obliczanie pierwiastków wyższych stopni;) też byłbym wdzięczny


(Sawyer47) #2

Jeżeli to C++ to powinno być a nie jak w C. Piszę powinno być, bo jak to jest w tym kompilatorze to nie wiem. Tu jest dokumentacja C++: http://www.cppreference.com/

U mnie taki kod działa:

double podstawa = 27.0, stopien = 3.0;

	std::cout << pow(podstawa, 1.0/stopien) << std::endl; // 3

Czy u ciebie te zmienne mają poprawne wartości? Zwracam uwagę, że tam powinny być wartości double, tzn. liczba zostanie zrzutowana, ale przy wykładniku trzeba by było napisać 1.0 / stopien.


(inż. Piniol) #3
wynik=pow(liczba,(1/ile);

Masz dzielenie 1/ile gdzie ile jest typu int, a powinien być jakiś typ zmiennoprzecinkowy. Wynik takiego dzielenia w większości przypadków nie da liczby całkowitej (czyli int) ;]


(Komputerowiec21w) #4

Funkcja pow z biblioteki cmath przyjmuje dwa argumenty: podstawę i wykładnik potęgi - oba typu double.

wynik=pow(liczba,(1/ile);

Funkcja ta zwraca też typ double, w związku z czym przy przypisaniu do zmiennej wynik (typu int) zostanie wykonana niejawna konwersja, w rezultacie której dojdzie do zaokrąglenia (np. z 4.323412 do 4). Zmienna ile jest typu int, takiego typu jest też stała dosłowna 1. Dzielenie inta przez int zawsze zwraca wynik będący liczbą całkowitą - w tym wypadku dla ile > 1 zawsze będzie to 0. Powinno zadziałać po zmianie typu zmiennych na double. Edit: pomijam już, że jest tu błąd, jeśli chodzi o nawiasy. Powinno być:

wynik=pow(liczba,(1/ile));

a nie:

wynik=pow(liczba,(1/ile);