为什么我们不能将operator%用于float和double类型的操作数?

时间:2013-06-22 13:03:51

标签: c

我是C / C ++的新手,所以我对基本类型有几个问题:

  1. 我在某处读过,运算符%不能应用于float或double类型的操作数。 那我怎样才能检查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 个答案:

答案 0 :(得分:8)

  

然后我如何检查float或double类型变量的可分性。 ??`

使用fmod%仅适用于整数操作数。 %不适用于浮点值,因为C已经提供了fmod库函数。

答案 1 :(得分:4)

一个。如果您想将其保持在浮点状态,请使用fmod中的<math.h>函数(C ++中std::fmod的{​​{1}})。

<cmath>范围与实现有关(尽管标准定义了最小范围,IIRC,应该是+ -32767,尽管在典型的机器上它将是-2147483648 - 2147483647)。如果整数在int范围内,您不必执行任何特定操作 - 如果int适合其范围,则会自动为int采用不带后缀的整数文字。另一方面,可能需要将更大的整数文字存储在longlong long中以避免溢出。

答案 2 :(得分:3)

使用函数fmod及其系列。

答案 3 :(得分:2)

以下是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;
}

注意我试图使I / O更具描述性 - 提示用户是一个好主意,而不是只是让一个闪烁的光标等着他。显然我在猜测一下(甚至可能不是你想要使用的语言......)

答案 4 :(得分:0)

  1. %不能用于浮点数,因为标准是这样说的。使用fmod。好的没关系,实际的原因是“余数”的概念只对整数除法有意义。 fmod的作用是为两个浮点参数生成一个整数商:

    float my_fmod(float a, float b)
    {
        int quot = (int) a/b;
        return a - (quot * b);
    }
    
  2. 如果您需要特定的整数范围,请不要将int与限定符一起使用,因为它们是特定于实现的。使用类似uint32_t的固定宽度类型。