2012-02-04 9 views
138

Ho un programma in C++ (compilato usando g ++). Sto cercando di applicare due doppie come operandi alla funzione modulo, ma ottengo il seguente errore:Non è possibile utilizzare il modulo sui doppi?

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

Ecco il codice:

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

Come è stato notato, fmod() fornisce la funzione necessaria. Come non è stato ancora notato, è importante rendersi conto che gli errori di arrotondamento nel secondo operando di 'fmod' possono causare comportamenti imprevisti. Ad esempio, 'fmod (1, 0.1);' matematicamente dovrebbe essere zero, ma in realtà sarà quasi 0.1. L'entità dell'errore aumenta con l'entità del quoziente. Ad esempio, 'fmod (9E14, 0.1);' valuta circa 0.05, che è da un punto di vista matematico semplicemente sbagliato. – supercat

+1

@supercat più dettagli sarebbe fantastico. Penso di avere un'idea di cosa succede dietro le quinte per far sì che ciò che dici sia vero, ma sarebbe bello vedere i motivi per cui ciò che dici è vero; sarebbe interessante vedere come funziona dietro le quinte (penso di capire ma potrebbe facilmente sbagliare). – RastaJedi

+2

I valori in virgola mobile rappresentano multipli interi esatti o frazioni di potenze di due. Ad esempio, il numero intero letterale 0.1 è esattamente 3602879701896397/36028797018963968 (quest'ultimo valore è una potenza di due). 'fmod (x, 0.1)' dividerà x per quella frazione precisa e prenderà il resto, invece di dividere per il valore numerico "un decimo". – supercat

risposta

214

L'operatore % è per gli interi. Stai cercando il fmod() function.

#include <cmath> 

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

} 
+0

Sto programmando in C++ per Qt e fmod ha un bug lì. Il risultato di fmod (angolo, 360) può essere 360 ​​(WAT ?!) – Paul

+1

@Paul: Probabilmente non è un bug. Se 'angle' è, per esempio,' 359.9999999', allora sia 'angle' che' fmod (angle, 360) 'possono essere visualizzati come' 360'. (Aggiungere altri 9 se necessario). Provare a stampare i valori con, ad esempio, 50 cifre di precisione. –

33

fmod(x, y) è la funzione che si utilizza.

2

Utilizzare fmod() da <cmath>. Se non si desidera includere il file di intestazione C (nota: U non può essere float o 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

Perché non si desidera includere il file di intestazione C? Ecco a cosa serve. –

Problemi correlati