1

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

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

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

4

9 回答 9

6

这是整数除法。如果将 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

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

于 2013-07-16T14:23:38.713 回答
2

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

y +=  (1.0/1059255)*x;
于 2013-07-16T14:24:18.973 回答
1

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

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

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

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

于 2013-07-16T14:36:21.767 回答
1

因为1/10592550整数除法

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

注意1.0is of type double, 1.0fis of type float, 选择一个合适的。

于 2013-07-16T14:25:09.167 回答
1

你会想要这样的东西:

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;
}

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

于 2013-07-16T14:25:34.073 回答
1

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

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

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

于 2013-07-16T14:26:59.440 回答
0

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

于 2013-07-16T14:24:20.900 回答
0

尝试这个:

for(x = 2 ; x <= 1059255; x++)
{
  y +=  (1.0/1059255.0)*x;
}
于 2013-07-16T14:25:54.857 回答
0

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

for(x = 2 ; x <= 1059255; x++)
{
    y +=  (float(1)/1059255)*x;
}
于 2013-07-16T14:25:57.840 回答