2012-02-04 14 views
138

Tengo un programa en C++ (compilado usando g ++). Estoy tratando de aplicar dos dobles como operandos a la función de módulo, pero me sale el siguiente error:No se puede usar el módulo en dobles?

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

Aquí está el código:

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

Como se ha señalado, HOQF() proporciona la función necesaria. Como aún no se ha notado, es importante darse cuenta de que los errores de redondeo en el segundo operando de 'fmod' pueden causar comportamientos inesperados. Por ejemplo, 'fmod (1, 0.1);' debe ser matemáticamente cero, pero de hecho será casi 0.1. El grado de error aumenta con la magnitud del cociente. Por ejemplo, 'fmod (9E14, 0.1);' se evalúa a aproximadamente 0.05, lo cual es matemáticamente erróneo. – supercat

+1

@supercat más detalles sería increíble. Creo que tengo una idea de lo que está detrás de las escenas para hacer que lo que dices sea cierto, pero sería bueno ver las razones de por qué lo que dices es verdad; Sería interesante ver cómo funciona detrás de las escenas (creo que entiendo, pero podría ser muy fácil equivocarse). – RastaJedi

+2

Los valores de punto flotante representan múltiplos enteros exactos o fracciones de potencias de dos. Por ejemplo, el entero literal 0.1 es exactamente 3602879701896397/36028797018963968 (el último valor es una potencia de dos). 'fmod (x, 0.1)' dividirá x por esa fracción precisa y tomará el resto, en lugar de dividir por el valor numérico "una décima". – supercat

Respuesta

214

El operador % es para enteros. Está buscando el fmod() function.

#include <cmath> 

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

} 
+0

Estoy programando en C++ para Qt y fmod tiene un error allí. El resultado de fmod (ángulo, 360) puede ser 360 (¿WAT ?!) – Paul

+1

@Paul: probablemente no sea un error. Si 'angle' es, por ejemplo,' 359.9999999', entonces tanto 'angle' como' fmod (angle, 360) 'se mostrarán como' 360'. (Agregue más 9s según sea necesario.) Intente imprimir los valores con, por ejemplo, 50 dígitos de precisión. –

33

fmod(x, y) es la función que utiliza.

2

Use fmod() de <cmath>. Si no desea incluir el archivo de cabecera C (nota: U no puede ser 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

¿Por qué no quieres incluir el archivo de encabezado C? Para eso está ahí. –

Cuestiones relacionadas