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

Rzutowanie statyczne

Object Storage Arubacloud
0 głosów
219 wizyt
pytanie zadane 14 września 2018 w C i C++ przez Ptaszor3 Użytkownik (900 p.)

Dzień dobry!

Moja funkcja ma na celu zamienienie ułamka dziesiętnego tak by liczby po przecinku stały się liczbami całkowitymi.

void fun(double Fnumber)
{
    double afPoint = fmod(Fnumber, 1);

    cout << afPoint << endl;

    while((afPoint - static_cast<int>(afPoint)) != 0)
    {
        afPoint *= 10;
    }
    cout << "zmienna = ";
    cout << afPoint;
}

przykłady oczekiwanego działania:

wejście: 0,312

wyjście: 312

-------------------

wejście: 21,32

wyjście: 32

 

działanie w rzeczywistości:

wejście: 0,312

wyjście: 312

-------------------

wejście: 21,32

wyjście: "Program nie kończy się"

 

Próbowałem zamiast rzutowania używać funkcji fmod z biblioteki cmath, ale wtedy wyniki były jeszcze bardziej nie

przewidywalne.

Błąd polega na nie kończeniu się programu gdy wprowadzana liczba jest większa od zera.

1
komentarz 14 września 2018 przez mokrowski Mędrzec (155,460 p.)

Operując liczbami rzeczywistymi, nie rozwiążesz tego problemu. Kluczowe jest zrozumienie problemu reprezentacji liczby zmiennoprzecinkowej w języku C++. Tu masz ilustrację problemu:

#include <iostream>
#include <iomanip>

int main() {
    double value = 10.0 / 6.0;
    std::cout << value << '\n'
        << std::setprecision(8) << value << '\n'
        << std::setprecision(12) << value << '\n'
        << std::setprecision(28) << value << '\n';
}

Wynik:

1.66667
1.6666667
1.66666666667
1.666666666666666740681534975

I teraz pytanie: Który wg. Ciebie wynik powinieneś bać w takim przypadku pod uwagę?

Określ z jaką precyzją chcesz wykonać to zadanie i dokonaj konwersji z użyciem np. std::sstream.

komentarz 14 września 2018 przez Ptaszor3 Użytkownik (900 p.)
Chyba rozumiem. Chodzi o to, że ułamki w c++ mogą być wyrażane tylko za pomocą ułamków dziesiętnych a to nie pozwala na wyrażanie niektórych ułamków? Przepraszam, za powtarzanie słowa "ułamek".
1
komentarz 14 września 2018 przez mokrowski Mędrzec (155,460 p.)
Trop dobry ale w szczegółach kilka błędów :) Jeśli posługiwać się terminologią "ułamek", nie wszystkie liczby da się w zadowalający sposób prezentować w skończonej postaci w ramach typu double lub float, stosując "ułamek dwójkowy". Spróbuj zmienić wartość value na 0.1 (jedna-dziesiąta). Zobacz jaki jest wynik dla ostatniej linii przy wysokim setprecision. Wartość 0.1 nie da się przedstawić w postaci ułamka o podstawie 1/2^X (dwa do potęgi iks).

Oczywiście problem maksymalnie uprościłem bo dokładniej zajmuje się tym norma IEEE 754.

Musisz zdecydować się na precyzję prezentacji, w ramach niej dokonać konwersji i dopiero zwrócić wartość.
komentarz 14 września 2018 przez Ptaszor3 Użytkownik (900 p.)
Dzięki za odpowiedź!

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

+1 głos
0 odpowiedzi 126 wizyt
pytanie zadane 16 czerwca 2022 w C# przez mateusz45 Gaduła (3,240 p.)
0 głosów
2 odpowiedzi 516 wizyt
pytanie zadane 29 lipca 2021 w C i C++ przez Stasiu Nowicjusz (190 p.)
0 głosów
2 odpowiedzi 712 wizyt
pytanie zadane 11 grudnia 2019 w C i C++ przez amtrax Dyskutant (9,630 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

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

...