【问题标题】:Why we can't use operator % for float and double type operands?为什么我们不能将 operator % 用于 float 和 double 类型的操作数?
【发布时间】:2013-06-19 12:26:03
【问题描述】:

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

  1. 我在某处读到运算符 % 不能应用于浮点型或双精度型操作数。 那么如何检查浮点型或双精度型变量的可分性呢?我在下面显示了我的程序错误:

    #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,我应该使用哪个限定符或如何实现如此大的范围?

【问题讨论】:

  • 至于您的第二个问题:根据您的编译器,long intlong long int 将为您提供高达 2^63-1 或大约 2E9 的范围。如果你做到了unsigned long long int,你将一路达到 2^64-1 或 40 亿。
  • @Floris 我们是否使用格式 % llu 表示 unsigned long long int ??
  • 我不明白您所说的“我怎样才能实现它”是什么意思。您正在使用上面的double 类型。如果您决定使用整数类型,那么我推荐的类型 (unsigned long long int n, k, t, i;) 可以使用。 double 类型足够大,可以在不损失精度的情况下包含这些数字 - double 在不损失精度的情况下可以容纳的最大整数是 2^53 - 请参阅 stackoverflow.com/questions/1848700/…
  • 是的,您将使用 %llu 作为格式说明符。 unsigned long long int i; printf("enter a number: "); scanf("%llu", &amp;i); printf("you entered %lld\n", i);
  • @floris k thnx alot.. :)

标签: c


【解决方案1】:

这是fmod 答案的替代方法 - 它回答了您最初提出的问题(因为您使用的是double 类型。如果您的 cmets 清楚地表明,您实际上只想使用整数类型,您可以按如下方式重写您的代码(使用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 更具描述性 - 提示用户是个好主意,而不是让闪烁的光标等待他。显然我对提示有点猜测(甚至可能不是您要使用的语言......)

【讨论】:

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

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

    【讨论】:

      【解决方案3】:

      一个。如果你想保持浮点数,请使用&lt;math.h&gt; 中的fmod 函数(C++ 中std::fmod 来自&lt;cmath&gt;)。

      b. int 范围取决于实现(尽管标准定义了 IIRC 的最小范围应该是 +-32767,尽管在典型机器上它将是 -2147483648 - 2147483647)。如果一个整数在int 的范围内,则您不必做任何特别的事情——如果int 在其范围内,那么会自动将一个不带后缀的整数文字作为int。另一方面,更大的整数文字可能需要存储在 longlong long 中以避免溢出。

      【讨论】:

        【解决方案4】:

        那么我如何检查浮点型或双精度型变量的可分性。 ??`

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

        【讨论】:

        • 简短而有价值的答案。
        • @EricPostpischil C 委员会在 C99 基本原理中写道,C89 委员会拒绝扩展 % 运算符以处理浮点类型,因为这种用法会重复 fmod 提供的功能
        • @ouah:嗯,怎么样。
        【解决方案5】:

        使用函数fmod 及其家族。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多