2012-02-04 21 views
138

Mam program w C++ (skompilowany za pomocą g ++). Staram się stosować dwa dwuosobowe jako argumenty do funkcji modułu, ale pojawia się następujący błąd:Nie można użyć modułu na deblu?

error: invalid operands of types 'double' and 'double' to binary 'operator%'

Oto kod:

int main() { 
    double x = 6.3; 
    double y = 2; 
    double z = x % y; 
} 
+9

Jak już wspomniano, fmod() zapewnia niezbędną funkcję. Jak jeszcze nie zostało to odnotowane, ważne jest, aby zdać sobie sprawę, że błędy zaokrąglania w drugim argumencie 'fmod' mogą powodować nieoczekiwane zachowania. Na przykład 'fmod (1, 0.1);' powinno być matematycznie zerowe, ale w rzeczywistości powinno być prawie 0,1. Zakres błędu wzrasta wraz z wielkością ilorazu. Na przykład 'fmod (9E14, 0.1);' ocenia na około 0,05, co jest z matematycznego punktu widzenia po prostu źle. – supercat

+1

@supercat więcej szczegółów byłoby niesamowite. Myślę, że mam pojęcie o tym, co kryje się za kulisami, aby spowodować, że to, co mówisz, jest prawdą, ale dobrze byłoby zobaczyć powody, dla których to, co mówisz, jest prawdą; byłoby interesujące zobaczyć, jak działa za kulisami (myślę, że rozumiem, ale bardzo łatwo można się mylić). – RastaJedi

+2

Wartości zmiennoprzecinkowe reprezentują dokładne wielokrotności całkowite lub udziały potęg dwóch. Na przykład liczba całkowita równa 0,1 to dokładnie 3602879701896397/36028797018963968 (ta ostatnia wartość to potęga dwóch). 'fmod (x, 0.1)' podzieli x przez ten dokładny ułamek i weź resztę, zamiast dzielić przez wartość liczbową "jedną dziesiątą". – supercat

Odpowiedz

214

Operator % jest dla liczb całkowitych. Szukasz fmod() function.

#include <cmath> 

int main() 
{ 
    double x = 6.3; 
    double y = 2.0; 
    double z = std::fmod(x,y); 

} 
+0

Programuję w C++ dla Qt i fmod ma tam błąd. Wynik fmod (kąt, 360) może wynosić 360 (WAT ?!) – Paul

+1

@Paul: To prawdopodobnie nie jest błąd. Jeśli "kąt" to, powiedzmy, "359.9999999", wówczas zarówno "kąt" jak i "fmod (kąt, 360)" prawdopodobnie będą wyświetlane jako "360". (Dodaj więcej 9 w razie potrzeby.) Spróbuj wydrukować wartości za pomocą, powiedzmy, 50 cyfr precyzji. –

33

fmod(x, y) to funkcja, której używasz.

2

Użyj fmod() z <cmath>. Jeśli nie chcesz dołączyć plik nagłówkowy C (uwaga: U nie może być float lub double):

template<typename T, typename U> 
constexpr T dmod (T x, U mod) 
{ 
    return !mod ? x : static_cast<long long>(x) % mod + x - static_cast<long long>(x); 
} 

//Usage: 
double z = dmod<double, unsigned int>(14.3, 4); 
double z = dmod<long, short>(14, 4); 
//This also works: 
double z = dmod(14, 4); 
double z = dmod(14, 0); 
double z = dmod(myFirstVariable, someOtherVariable); 
+0

Dlaczego nie chcesz dołączyć pliku nagłówkowego C? Po to tam jest. –

Powiązane problemy