【问题标题】:How can I get result except zero in division [duplicate]如何在除法中获得除零以外的结果[重复]
【发布时间】:2013-07-16 14:22:20
【问题描述】:

我写了下面的代码,但是我有一个问题。当我将 1 除以 1059255 时,结果将为零,因为除法的结果接近于零并且正在四舍五入。

for(x = 2 ; x <= 1059255; x++)
{
    y += (1/1059255) * x;
}

需要进行哪些更改才能获得正确的结果?

【问题讨论】:

    标签: c++


    【解决方案1】:

    这是整数除法。如果将 x/y 相除,其中 x 小于 y,则结果将始终为 0。将这些数字中的任何一个转换为浮点数。

    这里有一些可能性:

    y += (1.0f/1059255) * x; // float literal divide by integer, this will work
    

    y += (static_cast<float>(1)/1059255) * x; // casting integer literal to float, this works too
    

    显然,您也可以将分母设为浮点数,这也可以使用双精度数来完成。

    【讨论】:

      【解决方案2】:

      那是因为它是一个整数除法。将操作数设为浮点数或双精度数:

      y +=  (1.0/1059255)*x;
      

      【讨论】:

        【解决方案3】:

        因为1/1059255 在整数除法中是0

        将其更改为1.0/1059255 将获得您预期的结果。

        注意1.0 的类型为double1.0f 的类型为float,请选择合适的类型。

        【讨论】:

          【解决方案4】:

          你会想要这样的:

          const int start = 2;
          const int end = 1059256;
          float result = 0.0f;
          for(int x = start; x < end; ++i){
            result += 1.0f / float(MAX) * x;
          }
          

          你正在做的是整数除法,它有效地丢弃小数点并只保留整个整数。

          【讨论】:

            【解决方案5】:

            您需要使用可以表示除整数以外的数字的类型。您想要浮点类型还是定点类型取决于精度的重要性。但是,使用浮点数很容易做到这一点。

            double x, y = 0;
            for(x = 2 ; x <= 1059255; x++)
            {
                y +=  (1.0/1059255.0)*x;
            }
            

            如果您发现误差量不可接受,请查看定点数。

            【讨论】:

              【解决方案6】:

              在 C++ 中,两个整数相除得到一个整数。在这种情况下,您将两个整数相除,因此结果将始终被截断为0

              我不能从你的问题中确定,但你可能想要浮点除法,你可以通过在文字中添加 .0 后缀来强制。另外,我看不出有任何理由将除法+乘法更改为单个除法:

              for(x = 2 ; x <= 1059255; x++)
              {
                  y += x / 1059255.0;
              }
              

              但是,如果这是您的真实代码,则根本没有理由进行循环,因为您始终可以在恒定时间内计算结果(因为内部循环项与循环索引值成线性比例)。

              【讨论】:

                【解决方案7】:

                使用浮点数类型,例如 float 或 double。

                【讨论】:

                  【解决方案8】:

                  在除法中使用浮点数,以便乘法也正确:

                  for(x = 2 ; x <= 1059255; x++)
                  {
                      y +=  (float(1)/1059255)*x;
                  }
                  

                  【讨论】:

                    【解决方案9】:

                    试试这个:

                    for(x = 2 ; x <= 1059255; x++)
                    {
                      y +=  (1.0/1059255.0)*x;
                    }
                    

                    【讨论】:

                      猜你喜欢
                      • 2011-01-21
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2015-12-25
                      • 1970-01-01
                      • 2011-11-18
                      • 2013-03-02
                      • 2020-07-18
                      相关资源
                      最近更新 更多