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

c++ projekt euler

Object Storage Arubacloud
0 głosów
115 wizyt
pytanie zadane 14 czerwca 2018 w C i C++ przez Zaratustra Początkujący (320 p.)

Witam, chciałbym się dowiedzieć, dlaczego według programu c=((65*15+30)/2)*66=33132, a w rzeczywistości jest to 33165. Jestem pewien, że problem jest w tym, że w obliczaniach występuje przecinek, ale zmieniając "int" na float nadal występuje ten błąd. Proszę o wyjaśnienie lub naprowadzenie gdzie jest pies pogrzebany.

#include <iostream>

using namespace std;
int x= 333,y= 199,z=66, a,b,c,o;
int main()
{
    a=((332*3+6)/2)*x;
    b=((198*5+10)/2)*y;
    c=((65*15+30)/2)*z;
    cout<<a<<" ";
    cout<<b<<" ";
    cout<<c<<" ";
    o=a+b-c;
    cout<<o;

    return 0;
}

 

komentarz 14 czerwca 2018 przez Wiciorny Ekspert (270,110 p.)

Proste... jest to dlatego, że typ integer ... ucina nam wartości  ( zaokrągla je )

((65*15+30)/2)

wynikiem tego jest 502,5  ( razy 66) powinno dac 33165 jednak wynikiem jest 502 z racji tego że int automatycznie utnie nam 0,5 zatem 

ostatecznie wynikiem mnożenia  przez zmienną z jest 33132 :)  czyli o 0,5 * 66 mniej 

502 * 66 a nie 502,5 * 66 

 

komentarz 14 czerwca 2018 przez Zaratustra Początkujący (320 p.)
W dalszej części posta piszę, że się tego domyślam, ale zmieniając na float nadal jest tak samo, stąd moje pytanie co jest źle.
komentarz 14 czerwca 2018 przez Wiciorny Ekspert (270,110 p.)
bo float zwróci to samo...

  cout<<"wynik: "<<c/2<<endl;

sprawdź sobie  co zwróci nawet sam float :)
komentarz 14 czerwca 2018 przez Wiciorny Ekspert (270,110 p.)
#include <iostream>
 
using namespace std;
float x= 333,y= 199,z=66, a,b,c,o;
int main()
{
    a=((332*3+6)/2)*x;
    b=((198*5+10)/2)*y;
    c=((65*15+30));
    cout<<"wynik: "<<(float)(c/2)<<endl;
    c=c*z/2;
    cout<<a<<" ";
    cout<<b<<" ";
    cout<<c<<" ";
    o=a+b-c;
    cout<<o;
 
    return 0;
}

tutaj wyjdzie poprawny wynik :) ja bym zrobił rzutowanie po prostu ... 

1 odpowiedź

+1 głos
odpowiedź 15 czerwca 2018 przez k222 Nałogowiec (30,150 p.)

Może dołożę swoje trzy grosze, bo nie jestem pewien czy  wiesz co nie działa.

W C++ masz różne typy - masz int, float, double, string,... , ale możesz też używać po prostu liczb np.2 tak jak ty. Problem jest w tym, że w wyrażeniu:

c=((65*15+30)/2)*z;

kompilator prawą stronę traktuje jak działania na liczbach całkowitych, bo takie tam masz, zatem:
65*15+30 = 1005
1005 / 2  = 502 (bo liczby całkowite)
502 * 66 = 33132
i typ c niewiele tu zrobi, bo 65,15,30,2 to liczby całkowite. Jak zatem zmienić je na liczby zmiennoprzecinkowe? Bardzo prosto, wystarczy dodać .0 na końcu każdej::

c=((65.0*15.0+30.0)/2.0)*z;

zauważ, że teraz niezależnie czy c będzie typu float czy int, otrzymasz poprawny wynik, bo działanie 65.0*15.0+30.0)/2.0 zostanie wykonane na liczbach zmiennoprzecinkowych, a na końcu dopiero zamienione na int.

W takich sytuacjach jeżeli chcesz otrzymywać poprawne wyniki musisz albo używać tylko zmiennych które mają już typ z góry określony, albo dokładnie zaznaczać czy dana liczba jest całkowita np. 1 czy zmiennoprzecinkowa np. 1.0 bo to ma wpływ na wynik działania (przy dzieleniu, bo jakbyś miał samo dodawanie, odejmowanie i mnożenie to różnicy by nie  było).

komentarz 16 czerwca 2018 przez Zaratustra Początkujący (320 p.)

Idealnie! Nie wiedziałem, że to działa w ten sposób. Dziękuje za wyczerpującą odpowiedź!smiley

Podobne pytania

0 głosów
1 odpowiedź 219 wizyt
pytanie zadane 20 września 2019 w C i C++ przez kawapa Nowicjusz (210 p.)
0 głosów
2 odpowiedzi 557 wizyt
pytanie zadane 12 lutego 2017 w Java przez Szymon Ciamaga Obywatel (1,980 p.)
+1 głos
1 odpowiedź 222 wizyt
pytanie zadane 8 lipca 2020 w C i C++ przez gryzedywany Użytkownik (510 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!

...