Dziwne potęgowanie

0

Witam, mam taki dziwny problem. Robię zadanie na spoj "Czy umiesz potęgować" i o dziwo problemy przyszły bardzo szybko.
Nie wiem czym to jest spowodowane, ale kiedy potęguję np. 2 do potęgi trzeciej to wynik jest dobry ale już 11 do drugiej wypisuje 120 zamiast 121, tak samo 13 do drugiej. Niżej kod

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

using namespace std;

int main()
{
    int a, b, liczba;

    cin >> a >> b;

    liczba = pow(a, b);

    cout << liczba;
}

screenshot-20201029192644.png

2

Liczby zmiennoprzecinkowe są prawie zawsze obliczane w przybliżeniu (link: http://kaczus.ppa.pl/art/liczbyzmiennoprzecinkowe,19.html ) ale że to się dzieje dla 13² to aż mi się nie chce wierzyć

Ale tak przy okazji: to w tym zadaniu nie potrzebujesz użyć funkcji pow() do obliczenia wyniku. A nawet nie możesz.

0
kq napisał(a):

Liczby zmiennoprzecinkowe są prawie zawsze obliczane w przybliżeniu (link: http://kaczus.ppa.pl/art/liczbyzmiennoprzecinkowe,19.html ) ale że to się dzieje dla 13² to aż mi się nie chce wierzyć

Po drodze przelatuje przez logarytm/exp. A podstawienie pod integera to (chyba) obcięcie a nie zaokrąglenie. Wystarczy końcówka .99 i leci jeden w dół.

0

Ja rozumiem jak to może się stać, ale potęga jest naturalna, a zarówno 13, 2 jak i 169 są w pełni dokładnie wyrażalne za pomocą liczb zmiennoprzecinkowych (a nawet przez 16-bitowe floaty), stąd moje zdumienie. No i nie umiem powtórzyć tego błędu u siebie.

0

Napisz własną funkcję do potęgowania, albo dodawaj 0.5 do wyniku przed rzutowaniem na int

0

No więc napisałem swoją funkcję do potęgowania, i niby wszystko jest okej, ale sędzia odrzuca bo przekroczono limit czasu.

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

using namespace std;

int main()
{
    int a, b, ile, ostatnia_cyfra;
    int wynik = 1;

    cin >> ile;

    for(int i = 0; i < ile; i++)
    {

    cin >> a >> b;

    for(int i = 0; i < b; i++)
    {
        wynik *= a;
    }

    ostatnia_cyfra = wynik % 10;

    cout << ostatnia_cyfra << endl;

    }
}
1

Nie napisałeś żadnej funkcji poza main() ;​)

Musisz wziąć kilka rzeczy pod uwagę:

  • liczby w komputerze mają ograniczony zbiór wartości. Najczęściej dla int jest to od -2³¹ do 2³¹-1. Prawie na pewno wychodzisz tu poza ten zakres i masz bzdurne wyniki
  • jeśli przyjrzysz się wynikom, możesz zauważyć, że wcale nie musisz wykonywać tak wielu obliczeń - to jest zadanie na myślenie.
1

Najlepiej wklej tu treść zadania, pełną, będzie łatwiej prognozować ;)

0

Przecież tu nie można nic potęgować, liczby są za duże. Problem był na tym forum, poszukaj.

0

Nie jest źle. Jak pierwszy raz usiadłem do C++ to używałem operatora:

^

Myślałem, że służy do potęgowania :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0