我写了下面的代码,但我有一个问题。当我将 1 除以 1059255 时,结果将为零,因为除法的结果接近于零并且正在四舍五入。
for(x = 2 ; x <= 1059255; x++)
{
y += (1/1059255) * x;
}
需要进行哪些更改才能获得正确的结果?
我写了下面的代码,但我有一个问题。当我将 1 除以 1059255 时,结果将为零,因为除法的结果接近于零并且正在四舍五入。
for(x = 2 ; x <= 1059255; x++)
{
y += (1/1059255) * x;
}
需要进行哪些更改才能获得正确的结果?
这是整数除法。如果将 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
显然,您也可以将分母设为浮点数,这也可以使用双精度数来完成。
那是因为它是一个整数除法。使操作数浮动或双精度:
y += (1.0/1059255)*x;
在 C++ 中,两个整数的除法得到一个整数。在这种情况下,您将两个整数相除,因此结果将始终被截断为0
.
我不能从你的问题中确定,但你可能想要浮点除法,你可以通过.0
在文字中添加后缀来强制。此外,我看不出有任何理由将除法+乘法更改为单个除法:
for(x = 2 ; x <= 1059255; x++)
{
y += x / 1059255.0;
}
但是,如果这是您的真实代码,则根本没有理由进行循环,因为您始终可以在恒定时间内计算结果(因为内部循环项随循环索引值线性缩放)。
因为1/1059255
是0
整数除法
将其更改为1.0/1059255
将获得您的预期结果。
注意1.0
is of type double
, 1.0f
is of type float
, 选择一个合适的。
你会想要这样的东西:
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;
}
你正在做的是整数除法,它有效地丢弃小数点并只保留整个整数。
您需要使用可以表示除整数以外的数字的类型。您想要浮点类型还是定点类型取决于精度的重要性。但是,使用浮点数很容易做到这一点。
double x, y = 0;
for(x = 2 ; x <= 1059255; x++)
{
y += (1.0/1059255.0)*x;
}
如果您发现误差量不可接受,请查看定点数。
使用浮点数类型,如 float 或 double。
尝试这个:
for(x = 2 ; x <= 1059255; x++)
{
y += (1.0/1059255.0)*x;
}
在除法内使用浮点数,以便乘法也正确:
for(x = 2 ; x <= 1059255; x++)
{
y += (float(1)/1059255)*x;
}