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

Odnalazłem buga w Code::Blocks'ie

Object Storage Arubacloud
0 głosów
494 wizyt
pytanie zadane 7 lipca 2015 w Offtop przez PudloBudyniu Nowicjusz (120 p.)
Robiąc zadanie z potęgami wpadłem na coś dziwnego. Mianowicie pewien błąd, który dotyczy właśnie potęgowania (piszę to tu, bo chcę sprawdzić, czy to kwestia tego, ze moja wersja programu jest wadliwa, czy może jednak każdy tak ma). Otóż taki kod jak poniżej poda wynik prawidłowy i jeżeli wpiszemy a=5, a potem b=2, to dostaniemy wynik 25.

#include <iostream>
#include <cmath>

using namespace std;

int a,b;

int main()
{
    cin >> a >> b;

    cout << pow(a,b)<< endl;

   return 0;
}

Natomiast jeśli spróbujemy najpierw zapisać ten wynik do jakiejś zmiennej, a potem go wyświetlić, to w niektórych przypadkach zostanie on obniżony o jeden (czyli dla a=5 i b=2, dostaniemy wynik 24):

#include <iostream>
#include <cmath>

using namespace std;

int a,b,c;

int main()
{
    cin >> a >> b;

    c=pow(a,b);

    cout << c << endl;

   return 0;
}

W zasadzie zauważyłem, że dzieje się to tylko w przypadku gdy próbujemy podnieść do obojętnie jakiej potęgi, podstawę 5, lub wielokrotność 5 (wynik będzie obniżany, gdy spróbujemy podnieść do jakiejś potęgi 5, 10, 15... itd.). Nie mam zielonego pojęcia czemu tak się dzieje, ale wydało mi się to dość dziwne. Napiszcie czy wy też tak macie. :D

3 odpowiedzi

+6 głosów
odpowiedź 7 lipca 2015 przez hit02 Nałogowiec (33,970 p.)
edycja 7 lipca 2015 przez hit02

To nie jest błąd w C::B ani tym bardziej w kompilatorze, ale nie dokońca rozumiesz powyższy kod.

Funkcja pow() zwraca nie wartości całkowitej (integer), ale zmiennoprzecinkową (double), a ten typ danych nie jest dokładny. Jeśli wartość zwracaną wyrzucisz odrazu na ekran, to liczba zostanie zaokrąglona do 25, ale jeśli najpierw przekonwertujesz ją na integer, to zostanie obcięta w dół.

Na potwierdzenie polecam sprawdzić ten kod:

#include <iostream>
#include <cmath>
#include <iomanip>

using namespace std;

int main()
{
    int a,b;
    long double c;
	
    cin>>a>>b;
    c=pow(a,b);
    cout<<setprecision(999);
    cout<<c<<endl;
    return 0;
}

@edit O niedokładności liczb zmiennoprzecinkowych kiedyś pisałem na blogu, więc dorzucam link: http://hit02.blogspot.com/2015/02/liczby-zmiennoprzecinkowe-co-z-nimi.htmlsmiley

komentarz 7 lipca 2015 przez PudloBudyniu Nowicjusz (120 p.)
A to nie wiedziałem. Dzięki za odpowiedź z wyjaśnieniem! :D
0 głosów
odpowiedź 7 lipca 2015 przez tarnasm Gaduła (3,030 p.)
To błąd raczej samej biblioteki a nie Code::Blocks. Jeżeli zastosujesz mnożenie aby "zasymulowac" potęgowanie, w "gołym" C::B to będzie git :)
komentarz 7 lipca 2015 przez hit02 Nałogowiec (33,970 p.)

To akurat nie jest żaden błąd, ale poprawne działanie. smiley

komentarz 7 lipca 2015 przez tarnasm Gaduła (3,030 p.)
Nie wiedziałem że pow to double. Ale to przecierz logiczne. Liczba zwracana nie zawsze musi być intem.
0 głosów
odpowiedź 8 lipca 2015 przez mrcnsct Nałogowiec (36,390 p.)

Tutaj masz o liczbach zmiennoprzecinkowy w C, ale w C++ jest podobnie: https://www.youtube.com/watch?v=1_xowgDpzQE

Podobne pytania

0 głosów
2 odpowiedzi 222 wizyt
pytanie zadane 23 lipca 2015 w C i C++ przez llukasz Początkujący (350 p.)
0 głosów
1 odpowiedź 493 wizyt
pytanie zadane 13 sierpnia 2020 w C i C++ przez Wwjka Nowicjusz (120 p.)

92,572 zapytań

141,422 odpowiedzi

319,643 komentarzy

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

...