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

if(2==2)->false? Błędne porównanie? Sprawdzenie czy liczba jest całkowita...

Object Storage Arubacloud
0 głosów
228 wizyt
pytanie zadane 13 października 2017 w C i C++ przez Caspian Nowicjusz (150 p.)

   Witam. Zająłem się problemem wyliczenia wartości trójmianu kwadratowego: x^3 + px = q. Wynik ma być wartością naturalną(wypisujemy wtedy wartość x), w przeciwnym wypadku wypisujemy "NIE".

   Spotkałem się z problemem gdzie przy porównaniu dwóch zmiennych double o wartości 2 dostaje wartość false. Przy konwersji liczby wartości int bądź użyciu funkcji: trunc,floor czy rzutowaniu typu z double=2 otrzymuje int=1 ( co również jest dla mnie zagadką).

   Mógłbym prosić o wyjaśnienie tego zagadnienia, bądź sugestie co do rozwiązania tego problemu?

Testowe dane które wprowadzałem:

2

3 14

7 10

 

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

using namespace std;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    //PRZYSPIESZENIE
    int z; //LICZBA TESTOW
    double x; //ZMIENNA DO PRZECHOWANIA "OBCIETEJ WARTOSCI"
    cin >> z;
    long long p,q; //WARTOSCI POTRZEBNE DO WZORU
    double wynik[z];
    for (int i=0; i<z; i++)
    {
        cin >> p >> q;//IMPLEMENTACJA WZORU CARDANA
        wynik[i]=cbrt( (q / 2) + sqrt(pow(q / 2, 2) + pow( p / 3,3 )) ) - cbrt( (-q/2) + sqrt(pow(q / 2, 2) + pow( p / 3,3 )));

    }//OBLICZENIE WARTOSCI X
    for (int i=0; i<z; i++)
    {
        x = round(wynik[i]);
        cout << x << "<- to jest X" << endl;
        cout << wynik[i] << "<- to jest wynik" << endl;
        if (wynik[i] == x )cout << wynik[i];// <--TUTAJ WYSTEPUJE PROBLEM
        else cout << "NIE" << endl;
    }
    return 0;
}

 

1
komentarz 13 października 2017 przez mbabane Szeryf (79,280 p.)
edycja 13 października 2017 przez mbabane

Odchodząc od tematu. Nie bój się stosować opisowych nazw zmiennych. Używanie komentarzy w celu opisu do czego jest przeznaczona zmienna są nadmiarowe. Dużo lepszą metodą jest odpowiednie nazywanie zmiennych. Im wcześniej zaczniesz to praktykować tym lepszym będziesz programistą. Taki przykład:

 int z; //LICZBA TESTOW

Nazwij zmienną tak jak opis:

int number_of_test;

Stosowanie takich opisowych nazw prowadzi do: zmniejszenia liczby błędów w trakcie tworzenia kodu, szybszego zrozumienia kodu oraz nie marnuje się energii na szukanie miejsca deklaracji zmiennej w celu odczytania komentarza (nazwa zmiennej jest jednocześnie opisem przeznaczenia).

2 odpowiedzi

0 głosów
odpowiedź 13 października 2017 przez Bosswell Nałogowiec (36,470 p.)
wybrane 13 października 2017 przez Caspian
 
Najlepsza

Poczytaj o standardzie IEEE 754 i zapisie liczb zmiennoprzecinowym w komputerze. Zależnie od typu zmiennej otrzymasz inną precyzję.

Warunek się nie spełnia, ponieważ np 33 liczba po przecinku jest inna ;)

Jeżeli chcesz to sprawdzić w praktyce, to dodaj sobie biblioteke iomanip i użyj setprecision

http://www.cplusplus.com/reference/iomanip/setprecision/

 

komentarz 13 października 2017 przez Caspian Nowicjusz (150 p.)
Dziękuje za poświęcony czas.  Już biorę się za poprawki :D
+1 głos
odpowiedź 13 października 2017 przez criss Mędrzec (172,590 p.)

Przeczytaj tą odpowiedź. Tak jak już tam pisałem: ze skończonej ilości bitów wynika, że np. 2 * sqrt(5) wcale nie musi się równać sqrt(20), albo nawet, że w typie float będą równe, a w double już nie. Ale przecież w obu przypadkach wyprintowało 2, nie? cout troche cie oszukał, spróbuj dodać linie cout << setprecision(20); przed podejrzanymi outputami (std::setprecision jest w <iomanip>). Widocznie cout sam zaokrągla do całości jeśli liczba jest bardzo blisko takowej. Też mi się to nie podoba, ale "deal with it" :|

Podobne pytania

+1 głos
1 odpowiedź 595 wizyt
pytanie zadane 18 października 2020 w C i C++ przez Wolv63 Użytkownik (630 p.)
0 głosów
1 odpowiedź 3,772 wizyt
pytanie zadane 14 listopada 2018 w C i C++ przez Jennesse Nowicjusz (220 p.)
0 głosów
2 odpowiedzi 895 wizyt
pytanie zadane 25 grudnia 2020 w C i C++ przez Wacław Sierpiński Początkujący (350 p.)

92,552 zapytań

141,400 odpowiedzi

319,531 komentarzy

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

...