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