• 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

VPS Starter Arubacloud
0 głosów
486 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 217 wizyt
pytanie zadane 23 lipca 2015 w C i C++ przez llukasz Początkujący (350 p.)
0 głosów
1 odpowiedź 484 wizyt
pytanie zadane 13 sierpnia 2020 w C i C++ przez Wwjka Nowicjusz (120 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...