• 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,554 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 234 wizyt
pytanie zadane 26 kwietnia 2016 w JavaScript przez patrykz103 Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 997 wizyt
pytanie zadane 26 grudnia 2015 w C i C++ przez John Doe Obywatel (1,720 p.)
0 głosów
0 odpowiedzi 121 wizyt
pytanie zadane 28 stycznia 2016 w C i C++ przez JKluseczka Obywatel (1,430 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

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

...