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

question-closed Dlaczego komenda pow podaje zły wynik przy podstawie=5?

Object Storage Arubacloud
+1 głos
1,620 wizyt
pytanie zadane 11 czerwca 2015 w C i C++ przez ukszuu Nowicjusz (230 p.)
zamknięte 12 czerwca 2015 przez ukszuu

Witam serdecznie smiley

Tym razem mam problem z komendą potęgowania - pow. Oto kod:

#include <iostream>
#include <math.h>

using namespace std;

int a, b;
long long wynik;

int main()
{
        cin>>a>>b;
        wynik=pow(a,b);
        cout<<wynik<<endl;

    return 0;
}

Dlaczego, gdy w takim programie wpiszę a=5, i na przykład b=3 to otrzymuję wynik 124? Z tego co zauważyłem, to błędny wynik otrzymuję tylko, gdy a=5. Dla 5^2 dostaję 24, dla 5^7 ->78124.

Dla 5^10 dostaję poprawny wynik, a dla 5^12 znów zły.

 

Jeśli wpiszę:

cout<<pow(5,3)<<endl;

to problemu nie ma, wynik jest poprawny. 

komentarz zamknięcia: Udzielona odpowiedź

2 odpowiedzi

+5 głosów
odpowiedź 11 czerwca 2015 przez Radfler VIP (101,030 p.)
wybrane 11 czerwca 2015 przez ukszuu
 
Najlepsza

Bardzo znany i prosty do wyjaśnienia błąd:

Każdy egzemplarz funkcji pow() zwraca typ zmiennoprzecinkowy (http://en.cppreference.com/w/cpp/numeric/math/pow). Ta funkcja ma pewną ułomność - nie jest w 100% dokładna. Dla np. pow(5, 3) zobaczysz wynik 124, gdyż wypisałeś tą liczbę jako całkowitą. Funkcja pow zwróciła w rzeczywistości liczbę 124.(9). Jeżeli użyjesz typu double to wszystko będzie działać:

#include <iostream>
#include <cmath> // cmath a nie math.h !

using namespace std;

int a, b;
double wynik;

int main()
{
        cin>>a>>b;
        wynik=pow(a,b);
        cout<<wynik<<endl;
}
komentarz 11 czerwca 2015 przez ukszuu Nowicjusz (230 p.)
No rok bym siedział i bym tego nie wymyślił. Teraz działa. Dzięki!
komentarz 11 czerwca 2015 przez Radfler VIP (101,030 p.)
Sam myślałem nad tym jakiś rok temu. Wykminiłem to po dwóch dniach :D
komentarz 11 czerwca 2015 przez Boshi VIP (100,240 p.)
Jak tak niedokładna funkcja mogła się znaleźć w pod. bibliotece?   jest jakiś powód dlaczego ona zwraca w ogóle double ?
komentarz 11 czerwca 2015 przez Radfler VIP (101,030 p.)
Tego pana się pytaj, nie mnie :v http://bit.ly/1MtQOu9
komentarz 11 czerwca 2015 przez Pieniek Gaduła (3,330 p.)

Prosta sprawa zawsze można napisać coś takiego

template < class klasa >
klasa potegowanie(klasa x, klasa y){
	klasa wynik = x;
	while (y > 1){
		wynik *= x;
		y--;
	}
	return wynik;
}

Ale taki szablon się nie sprawdzi jeśli y będzie liczbą niecałkowitą sprawdz taki kod:

#include<iostream>

using namespace std;

template < class klasa >
klasa potegowanie(klasa x, klasa y){
	klasa wynik = x;
	while (y > 1){
		wynik *= x;
		y--;
	}
	return wynik;
}

int main(){
	double x = 2;
	double y = 2.2;
	cout << "Potegowanie przy pomocy szablonu: " << potegowanie < double >(x,y) << "\nPotegowanie funkcja pow: " << pow(x, y);
	cin >> x;

}

 

komentarz 12 czerwca 2015 przez Radfler VIP (101,030 p.)

Zawsze można użyć asercji do sprawdzenia typu:

template <typename Type>
Type pow(Type base, Type index){

    static_assert(std::is_integral<Type>::value, "Typ musi być całkowity");
    return (index) ? (pow(base, index - 1) * base) : (1);
}

Oraz funkcji rekurencyjnej ;)

0 głosów
odpowiedź 11 czerwca 2015 przez damian.zdunek.201 Obywatel (1,420 p.)

Prawdopodobnie dlatego, że wynik zapisujesz do zmiennej typu long long. Spróbuj tak zadeklarować tę zmienną:

double wynik;

 

Podobne pytania

0 głosów
2 odpowiedzi 251 wizyt
pytanie zadane 26 kwietnia 2016 w JavaScript przez patrykz103 Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 1,016 wizyt
pytanie zadane 26 grudnia 2015 w C i C++ przez John Doe Obywatel (1,720 p.)
0 głosów
0 odpowiedzi 125 wizyt
pytanie zadane 28 stycznia 2016 w C i C++ przez JKluseczka Obywatel (1,430 p.)

92,762 zapytań

141,686 odpowiedzi

320,499 komentarzy

62,106 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

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!

...