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

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

  1. 我在某处读过运算符%不能应用于float或double类型的操作数。 那我怎样才能检查float或double类型变量的可分性? 我在下面显示了我的程序错误:

    #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. 如果正整数的范围最大为10 ^ 9,我应该使用哪个限定符或如何实现如此大的范围?

这是fmod答案的替代方案 – 它回答了您最初提出的问题(因为您使用的是double类型。如果从您的注释中可以清楚地看到,您实际上只想使用整数类型,则可以按如下方式重写代码(使用unsigned long long int类型为您提供足够的空间):

 #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 

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

那么我该如何检查float或double类型变量的可分性。 ??`

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

一个。 如果你想让它保持浮点状态,可以使用fmod函数(C ++中的中的std::fmod )。

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

使用函数fmod及其系列。

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

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