¿Por qué no podemos usar el operador% para operandos de tipo flotante y doble?

Soy nuevo en C / C ++, así que tengo un par de preguntas sobre un tipo básico:

  1. He leído en alguna parte que el operador% no se puede aplicar a los operandos de tipo flotante o doble. Entonces, ¿cómo puedo verificar la divisibilidad de las variables de tipo flotante o doble? He mostrado mi progtwig con error abajo:

    #include  int main() { double n,k,t,i; int j=0; scanf("%f %f",&n,&k); i=0; while(i<n) { scanf("%f",&t); if(t%k==0) /* error:invalid operands to binary % */ j++; i++; } printf("%d",j); return 0; } 
  2. Si un entero positivo tiene un rango de hasta 10 ^ 9, ¿qué calificador debo usar o cómo lograr un rango tan grande?

Aquí hay una alternativa a las respuestas de fmod , que responden a la pregunta que originalmente hizo (ya que estaba usando el tipo double . Si, como se desprende de sus comentarios, en realidad desea usar solo tipos de enteros, puede volver a escribir su código de la siguiente manera ( con el tipo unsigned long long int para darle un montón de espacio para la cabeza):

 #include  int main() { unsigned long long int n, k, t, i, j=0; printf("enter the number of attempts: "); scanf("%llu", &n); printf("\nEnter the factor: "); scanf("%llu", &k); i=0; while(i 

Tenga en cuenta que he intentado que la E / S sea un poco más descriptiva; es una buena idea preguntar al usuario, en lugar de tener un cursor parpadeante esperándolo. Obviamente estoy adivinando un poco las indicaciones (puede que ni siquiera sea el idioma que quieres usar ...)

Entonces, ¿cómo puedo verificar la divisibilidad de las variables de tipo flotante o doble? ???

Utilice fmod . % solo trabaja con operandos enteros. % no funciona con valores de punto flotante porque C ya proporciona la función de biblioteca fmod .

a. si desea mantenerlo en punto flotante, use la función fmod de ( std::fmod de en C ++).

segundo. el rango int depende de la implementación (aunque el estándar define un rango mínimo que, IIRC, debería ser de + -32767, aunque en máquinas típicas será -2147483648 – 2147483647). Si un número entero está en el rango de int , no tiene que hacer nada en particular: un literal de tipo entero sin sufijos se toma automáticamente para un int si encaja en su rango. Por otro lado, los literales enteros más grandes pueden necesitar ser almacenados en un long o long long para evitar el desbordamiento.

Utiliza la función fmod y su familia.

  1. % no se puede usar en flotadores porque la norma lo dice. Utilice fmod . Está bien, está bien, la razón real es que el concepto de “rest” solo tiene sentido para la división entera. Lo que fmod hace es producir un cociente entero para dos argumentos de punto flotante:

     float my_fmod(float a, float b) { int quot = (int) a/b; return a - (quot * b); } 
  2. Si necesita un rango específico para un entero, no use int con calificadores, ya que son específicos de la implementación. Utilice un tipo de ancho fijo como uint32_t .