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

Funkcja pow() - jak poprawnie policzyć modulo ze zwróconej wartości?

Object Storage Arubacloud
0 głosów
222 wizyt
pytanie zadane 14 lutego 2016 w C i C++ przez salvatoreone Początkujący (270 p.)

Hej, moje pytanie jest następujące: funkcja pow() zwraca typ double, natomiast z takiego typu nie można policzyć modulo a rzutowanie na typ int skutkuje złymi wynikami (wyczytałem, że to z powodu niedokładności wyniku potęgowania). To jak właściwie należy to zrobić?

P.S.

Wierzyć się nie chce, że potęgowanie sprawia taki problem w c++

4 odpowiedzi

+1 głos
odpowiedź 14 lutego 2016 przez mitelak Pasjonat (23,330 p.)
wybrane 14 lutego 2016 przez salvatoreone
 
Najlepsza

Po prostu deklarujesz zmienną typu int i wrzucasz do niej zmienną z doublem. Działa to tak, że ucina Ci to co po przecinku, więc żeby mieć dobry wynik użyj funkcji round na zmiennej z doublem, a dopiero później dokonaj tej konwersji.
 

double x = 4.6542312;
x = round(x);
int y = x;

 

komentarz 14 lutego 2016 przez salvatoreone Początkujący (270 p.)
dzięki, o to chodziło, wiedziałem, że musi być jakieś proste rozwiązanie :)
+2 głosów
odpowiedź 14 lutego 2016 przez draghan VIP (106,230 p.)
W bibliotece cmath masz funkcję fmod - zwraca resztę z dzielenia dla liczb double.
0 głosów
odpowiedź 14 lutego 2016 przez secsec Mądrala (7,250 p.)
Wrzuć kod, tak będzie o wiele wygodniej i szybciej Ci pomożemy. Zawsze możesz przeprowadzić przypisanie double na int, tyle, że stracisz część ułamkową. Daj kod, to powiem Ci dokładnie.
komentarz 14 lutego 2016 przez secsec Mądrala (7,250 p.)

Możesz spróbować przez wprowadzenie do kodu źródłowego:

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

Być może pozwoli Ci na zawarcie części ułamkowej.

0 głosów
odpowiedź 14 lutego 2016 przez salvatoreone Początkujący (270 p.)

Jak widać na tą chwilę napisałem sobie na szybko funkcję liczącą potęgi liczb całkowitych o wykładniku będącym liczbą naturalną - ponieważ tylko takie wystąpią w tym programie (dzieli on wprowadzone liczby na połowy). Gdy chciałem skorzystać ze standardowej funkcji pow() pojawiły się problemy z 1. liczeniem modulo z typu double 2. wynikiem potęgowania po rzutowaniu na int.

#include <iostream>
#include <cmath>

using namespace std;

unsigned digitsNumber (unsigned i)
{
    return i > 0 ? (int) log10 ((double) i) + 1 : 1;
}

int power(int base, int exponent) //potegowanie - z powodu problemu z liczeniem modulo z liczby zwroconej przez standardowo funkcje pow()
{


    if (exponent>1)
    {
        exponent--;
        base*=power(base, exponent);
    }
    else if (exponent==0)
        return 1;
    else if (exponent<0)
    {
        return 0; // funckja nie liczy poteg ujemnych
    }

    return base;
}


int main()
{

    while(true)
    {
        int K;
        cin>>K;

        int dN = digitsNumber(K);
        cout<<dN<<endl;

        if (dN%2 == 0)
        {
            int leftHalf = K / power(10, (dN/2));
            int rightHalf = K % power(10, (dN/2));

            cout<<"LH:"<<leftHalf<<endl<<"RH:"<<rightHalf<<endl;
        }
        else
        {
            int leftHalf = K / power(10, ((dN+1)/2));
            int rightHalf = K % power(10, ((dN-1)/2));

            cout<<"LH:"<<leftHalf<<endl<<"RH:"<<rightHalf<<endl;
        }
    }


    return 0;
}

 

Podobne pytania

0 głosów
2 odpowiedzi 284 wizyt
0 głosów
2 odpowiedzi 519 wizyt
0 głosów
1 odpowiedź 106 wizyt
pytanie zadane 30 grudnia 2017 w C i C++ przez Jarvis Nowicjusz (170 p.)

92,584 zapytań

141,433 odpowiedzi

319,668 komentarzy

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

...