【发布时间】:2013-07-16 14:22:20
【问题描述】:
我写了下面的代码,但是我有一个问题。当我将 1 除以 1059255 时,结果将为零,因为除法的结果接近于零并且正在四舍五入。
for(x = 2 ; x <= 1059255; x++)
{
y += (1/1059255) * x;
}
需要进行哪些更改才能获得正确的结果?
【问题讨论】:
标签: c++
我写了下面的代码,但是我有一个问题。当我将 1 除以 1059255 时,结果将为零,因为除法的结果接近于零并且正在四舍五入。
for(x = 2 ; x <= 1059255; x++)
{
y += (1/1059255) * x;
}
需要进行哪些更改才能获得正确的结果?
【问题讨论】:
标签: c++
这是整数除法。如果将 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;
【讨论】:
因为1/1059255 在整数除法中是0
将其更改为1.0/1059255 将获得您预期的结果。
注意1.0 的类型为double,1.0f 的类型为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;
}
如果您发现误差量不可接受,请查看定点数。
【讨论】:
在 C++ 中,两个整数相除得到一个整数。在这种情况下,您将两个整数相除,因此结果将始终被截断为0。
我不能从你的问题中确定,但你可能想要浮点除法,你可以通过在文字中添加 .0 后缀来强制。另外,我看不出有任何理由将除法+乘法更改为单个除法:
for(x = 2 ; x <= 1059255; x++)
{
y += x / 1059255.0;
}
但是,如果这是您的真实代码,则根本没有理由进行循环,因为您始终可以在恒定时间内计算结果(因为内部循环项与循环索引值成线性比例)。
【讨论】:
使用浮点数类型,例如 float 或 double。
【讨论】:
在除法中使用浮点数,以便乘法也正确:
for(x = 2 ; x <= 1059255; x++)
{
y += (float(1)/1059255)*x;
}
【讨论】:
试试这个:
for(x = 2 ; x <= 1059255; x++)
{
y += (1.0/1059255.0)*x;
}
【讨论】: