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

Problem z komendą cout.precision()

Object Storage Arubacloud
0 głosów
4,602 wizyt
pytanie zadane 26 kwietnia 2015 w C i C++ przez Bakcyl Nowicjusz (120 p.)

Witam! Chciałbym zapytać o to jak właściwie powinnienem używać komendy cout.precision(), ponieważ kiedy np zadeklaruje dwie zmienne jako double i pomnoże je ze sobą po czym użyje tej funkcji aby została wyświetlona pełna liczba to zawsze zostaje wyświetlone zaokrąglenie tej liczby, a przynajmniej tak uważam, ponieważ na końcu jest zawsze kilka zer. Dodam, że iloczyn tych liczb nie przekracza zakresu double, więc gdzie popełniam błąd? I co powinienem zrobić aby uzyskać prawidłowy niezaokrąglony wynik? 

3 odpowiedzi

+1 głos
odpowiedź 26 kwietnia 2015 przez krecik1334 Maniak (58,390 p.)

Używając cout.precision zawsze musisz przy wypisywaniu dodać "fixed", np:

double x;
cout.precision(2);
cout << fixed << x << endl;

Chyba każdy się kiedyś na tym przejechał laugh

komentarz 26 kwietnia 2015 przez Bakcyl Nowicjusz (120 p.)
Nawet kiedy zmieniłem kod na taki jak podałeś to wynik jest błędny, otrzymuje takie coś: 864197530864196640000000000000 a przecież wynik powinnien kończyć się 7
komentarz 26 kwietnia 2015 przez krecik1334 Maniak (58,390 p.)
Twoje liczby "double" to tak naprawdę są liczby całkowite przechowywane tylko w tym kontenerze. Nie ma sensu używać funkcji precision do wypisywania liczb całkowitych.
komentarz 26 kwietnia 2015 przez Bakcyl Nowicjusz (120 p.)
No dobrze ale to tylko przykładowe liczby, żeby nauczyć się jak wyświetlać liczby zadeklarowane jako double, mam rozumieć, że jeśli podam liczby przekraczjące long long inta to wtedy ta funkcja będzie dziłała poprawnie? Poza tym nie ma jakiegoś sposobu żeby zawsze działało?
+1 głos
odpowiedź 27 kwietnia 2015 przez Arsetus Gaduła (4,760 p.)
Pan Mirosław rozwinął ten problem w swoich kursach języka C++.

Mianowicie w tym odcinku: https://www.youtube.com/watch?v=Rt1HnMdzINo

Jeśli nie chcesz oglądać całego, to w tym momencie: https://www.youtube.com/watch?feature=player_detailpage&v=Rt1HnMdzINo#t=1671

Pozdrawiam.
komentarz 27 kwietnia 2015 przez Bakcyl Nowicjusz (120 p.)
Nawet z tą funkcją mój program nie działa prawidłowo, nadal wyświetla zaokrągloną liczbę, co dziwne ściągnąłem program Pana Mirosława i wyświetla on liczby w zapisie naukowym mimo komendy  "setprecision(10000)", więc już całkiem nie rozumiem dlaczego nie działa. Może jakiś problem z kompilatorem? Chociaż dotąd żadnych nie miałem, używam Dev-C++.
komentarz 27 kwietnia 2015 przez Arsetus Gaduła (4,760 p.)
Sprawdziłem u siebie i działa bez problemu. Wychodzi więc, że to problem z twoim kompilatorem. Ja również używam Dev C++. Mój kompilator to: TDM-GCC 4.8.1
komentarz 27 kwietnia 2015 przez Bakcyl Nowicjusz (120 p.)
Przeinstalowałem całego Dev, bo okazało się, że mam ten sam kompilator i jest progres, kod Pana Mirosława działa, to znaczy chyba działa bo późniejszych wyników nie jestem wstanie sprawdzić czy są prawidłowe, jednak ilość cyfr wskazuje, że możliwę iż wszystko działa poprawnie. Jednak kiedy wróciłem do swojego programu mającego wyświetlać iloczyn dwóch liczb double i program działa tylko dla małych liczb (nie przekraczających 5-8 cyfr) potem wyświetla błędne wyniki. Myślisz, że dalej kompilator?
komentarz 27 kwietnia 2015 przez Arsetus Gaduła (4,760 p.)
Teraz to już nie kompilator ale pojemność zmiennej double. Użyj w swoim programie zmiennej long double, może akurat Ci będzie działać już poprawnie.
komentarz 27 kwietnia 2015 przez Bakcyl Nowicjusz (120 p.)
Zwiększenie zakresu na long double pozwala na otrzymanie wyników przy troszkę większych liczbach, ale i tak przy iloczynie liczb dwudziesto cyfrowych program wyświetla zły wynik, a przecież w filmiku który podesłałeś program wyświetla cyfry posiadające setki cyfr będąc zadeklarowane jako long double, więc nadal coś jest u mnie nie tak, albo czegoś nie wiem.
komentarz 27 kwietnia 2015 przez Arsetus Gaduła (4,760 p.)

U mnie poprawnie wyświetla, czyli to ciągle jest wina twojego kompilatora, lub po prostu komp Ci szwankuje. Screen jako dowód.

0 głosów
odpowiedź 26 kwietnia 2015 przez falauthy Stary wyjadacz (11,550 p.)

No bo ta funkcja ma zaokrąglać liczby. Jak chcesz np. do dwóch miejsc po przecinku to wpisujesz
 

cout.precision(2);

itd.

komentarz 26 kwietnia 2015 przez Bakcyl Nowicjusz (120 p.)
Dzięki za szybką odpowiedź, ale jak w takim razie wyświetlić pełną liczbę zadeklarowaną jako double?
komentarz 26 kwietnia 2015 przez falauthy Stary wyjadacz (11,550 p.)

Nie wiem czy o to chodzi, ale spróbuj wklepać
 

cout.setf(ios::fixed, ios::floatfield);

 

komentarz 26 kwietnia 2015 przez Bakcyl Nowicjusz (120 p.)

Efekt taki sam jak przy użyciu cout.precision() tylko że dodatkowo wyświetla poprzednia liczba.0000

komentarz 26 kwietnia 2015 przez falauthy Stary wyjadacz (11,550 p.)

Ale używasz też przy kompilacji
 

cout.precision();

czy nie?

Pokaże Ci mój kod i jak to działa

http://i58.tinypic.com/28qth8i.png

komentarz 26 kwietnia 2015 przez Bakcyl Nowicjusz (120 p.)
Tak wygląda mój kod:

    double a=111111111111111;
    double b=7777777777777777;
 
  cout.setf(ios::fixed, ios::floatfield);
        
    cout<<a*b;

Czyli u mnie jest taka różnica, że pracuje na liczbach całkowitych (Wiem, że mógłbym użyć inta ale mam zadankto do zrobienia gdzie są liczby przekraczjące long long inta, ale całkowite i chcę nauczyć się je wyświetlać)

Podobne pytania

0 głosów
2 odpowiedzi 1,208 wizyt
0 głosów
0 odpowiedzi 369 wizyt
0 głosów
2 odpowiedzi 3,287 wizyt

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

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

...