Jak zrobic zeby program sprawdzal czy podalem int czy float?
Ogólnie mogłbyś prawdzać czy liczba jest całkowita, ale przez to, że float jest zmiennoprzecinkowa byś raczej zawiódł by się na tym. Może wczytaj do char'a*/string'a i sprawdzaj czy jest kropka?
PS. A potem skonwertuj do int'a/float'a.
- Wczytać do double Podano.
- Jeżeli (int)Podano==Podano oznacza to że podał int.
Można też tak:
if ( liczba == (float)liczba ) => zmiennoprzecinkowa
if ( liczba == (int)liczba ) => całkowita
... przez rzutowanie.
A jak użytkownik wpisał 23.000, to wpisał liczbę typu int, czy typu float?
Jeżeli po przecinku są same zera, to liczba jest całkowita, nieważne czy użytkownik uwzględnił przecinek.
float x;
float p;
cin >> x;
p = modff(x, &p);
cout << "p = " << p << "\nx = " << x << "\n";
(p == 0) ? cout << "liczba calkowita" : cout << "liczba rzeczywista";
może tak? Oczywiście nastąpi przekłamanie gdy zostanie wprowadzona za duża ilość cyfr po przecinku.
Skoro dla niektórych 23.000 i 23 to to samo, to sugerowałbym się zapoznać z takimi terminami jak cyfry znaczące i dokładność obliczeń.
somekind napisał(a)
Skoro dla niektórych 23.000 i 23 to to samo
Dla Ciebie to nie jest to samo? Pytam jako matematyk.
kij napisał(a)
Dla Ciebie to nie jest to samo? Pytam jako matematyk.
To tak jakbyś spytał czy dla mnie koń jest ssakiem.
somekind napisał(a)
kij napisał(a)
somekind napisał(a)
Dla Ciebie to nie jest to samo? Pytam jako matematyk.
Skoro dla niektórych 23.000 i 23 to to samo
To tak jakbyś spytał czy dla mnie koń jest ssakiem.
To jest raczej pytanie z rodzaju „czy struś jest dinozaurem?”
I tak i nie, zależy od definicji dinozaura.
23.000 i 23 matematycznie to to samo (ściślej: tyle samo). W językach programowania może być różnie, np. porówania może zwracać prawdę, ale bezpośrednie przypisanie niekoniecznie musi się udać.
23 i 23.000 to nie to samo.
Zdanie "Indyk waży 23 kG." oznacza, że waga indyka jest między 22.5 a 23.5
Zdanie "Indyk waży 23.000 kG." oznacza, że waga indyka jest między 22.995 a 23.005.
Zdanie "Indyk waży 23 kG." oznacza, że waga indyka jest między 22.5 a 23.5
Ja się tam nie znam na definicjach matematycznych, ale dla mnie zdanie "Indyk waży 23 kG." oznacza że waga indyka wynosi 23 kG.
@Azarien - może ale nie musi:
(equal 2.0 2)
NIL
(CL) Wszystko zależy od sposobu porównania.
Nie istnieje na świecie indyk, którego waga wynosi 23 kG. Poprzednie zdanie pozostaje prawdziwe po zamianie liczby 23 na jakąkolwiek inną.
bogdans napisał(a)
Nie istnieje na świecie indyk, którego waga wynosi 23 kG. Poprzednie zdanie pozostaje prawdziwe po zamianie liczby 23 na jakąkolwiek inną.
Tym bardziej jak piszecie kG, a nie kg:
http://pl.wikipedia.org/wiki/Kilogram-si%C5%82a
bogdans napisał(a)
Nie istnieje na świecie indyk, którego waga wynosi 23 kG. Poprzednie zdanie pozostaje prawdziwe po zamianie liczby 23 na jakąkolwiek inną.
Tym bardziej jak piszecie kG, a nie kg:
http://pl.wikipedia.org/wiki/Kilogram-si%C5%82a
bogdans napisał(a)
Nie istnieje na świecie indyk, którego waga wynosi 23 kG. Poprzednie zdanie pozostaje prawdziwe po zamianie liczby 23 na jakąkolwiek inną.
Tym bardziej jak piszecie kG, a nie kg:
http://pl.wikipedia.org/wiki/Kilogram-si%C5%82a
A czy 23.000 * 41.874 to to samo co 23 * 41.874?
Dlaczego miałbym pisać kg? Pisałem o wadze, a nie o masie indyka.
Ty pisałeś nie o masie, tylko o sile ziemskiego przyciągania -,-. Sorka, ale na Ziemii Masa == Waga!
PS. Ja kupuje 1 kg owoców, nie 10 niutonów.
Ja jednak myślę, że @bo jasno się wyraził, od początku pisał o wadze.
Liczba cyfr po przecinku też ma w realnym świecie znaczenie, bo określa dokładność (czy raczej niedokładność) pomiaru. Więc to, czy te zera można zignorować czy nie, zależy od kontekstu, a nie od tego, że "matematycznie to jest to samo".
Wracając do postu kija:
Jeżeli chodzi o standard liczb zmiennoprzecinkowych IEEE to:
a + (b + c) != (a + b) + c
a / b * b != a
0 != -0 (tak, są dodatnie i ujemne zera)
itd
Jak widać jest to nieco sprzeczne z matematyką i trzeba to uwzględnić przy projektowaniu języków programowania, kompilatorów jak i samych programów.
Edit:
Fakt, MSM, masz rację, w sumie błędnie założyłem, że floaty są porównywane tymi samymi funkcjami co inty.
#include <cstdlib>
#include <iostream>
int main(int argc, char** argv) {
float zero = 0.f;
u_int32_t temp = *reinterpret_cast<u_int32_t*>(&zero) ^ 0x80000000;
float minusZero = *reinterpret_cast<float*>(&temp);
std::cout << zero << " " << minusZero << " " << (zero == minusZero);
return EXIT_SUCCESS;
}
U mnie ten kod normalnie działa, na ideone.com wywala jakieś niezrozumiałe warningi (chodzi o jakieś wyrównywanie, ale gdzie tu złe wyrównanie?).