Почему мы не можем использовать оператор% для операндов с плавающей точкой и двойного типа?

Я новичок в C/C++, поэтому у меня есть пара вопросов о базовом типе:

  1. Я где-то читал, что оператор% нельзя применять к операндам с плавающей запятой или двойным типам. Тогда как я могу проверить делимость переменных типа float или double? Я показал свою программу с ошибкой ниже:

    #include <stdio.h>
    
    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. Если положительное целое число имеет диапазон до 10^9, какой классификатор мне следует использовать или как достичь такого большого диапазона?

5 ответов

Решение

Вот альтернатива fmod ответы - которые отвечают на вопрос, который вы изначально задали (так как вы использовали double тип. Если, как видно из ваших комментариев, вы на самом деле хотите использовать только целочисленные типы, вы можете переписать свой код следующим образом (с помощью unsigned long long int типа, чтобы дать вам много запаса):

#include <stdio.h>

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<n)
    {
       printf("\nEnter the number to test: ");
       scanf("%llu",&t);
       if(t%k==0) 
         j++;
       i++;
    }
    printf("The number of multiples found was %llu\n", j);
    return 0;
}

Примечание. Я попытался сделать ввод-вывод более описательным - это хорошая идея, чтобы подсказывать пользователю, а не просто мигающий курсор, ожидающий его. Очевидно, я немного догадываюсь о подсказках (возможно, это даже не тот язык, который вы хотите использовать...)

тогда как я могу проверить делимость переменных типа float или double.??`

использование fmod, % работать только с целочисленными операндами. % не работает со значениями с плавающей запятой, потому что C уже обеспечивает fmod библиотечная функция.

А. если вы хотите сохранить его с плавающей точкой, используйте fmod функция от <math.h> (std::fmod от <cmath> в C++).

б. int Диапазон зависит от реализации (хотя стандарт определяет минимальный диапазон, который, IIRC, должен составлять +-32767, хотя на типичных машинах он будет -2147483648 - 2147483647). Если целое число находится в диапазоне int вам не нужно делать ничего конкретного - целочисленный литерал без суффиксов автоматически принимается за int если он вписывается в свой диапазон. С другой стороны, большие целочисленные литералы, возможно, должны быть сохранены в long или же long long чтобы избежать переполнения.

Используйте функцию fmod и ее семью.

  1. % не может использоваться на поплавках, потому что стандарт говорит так. использование fmod, Хорошо, хорошо, хорошо, фактическая причина в том, что понятие "остаток" имеет смысл только для целочисленного деления. Какие fmod do создает целочисленное отношение для двух аргументов с плавающей точкой:

    float my_fmod(float a, float b)
    {
        int quot = (int) a/b;
        return a - (quot * b);
    }
    
  2. Если вам нужен определенный диапазон для целого числа, не используйте int с квалификаторами, так как они зависят от реализации. Используйте тип с фиксированной шириной, например uint32_t,

Другие вопросы по тегам