2

我有代码:

for(int i = 0; i < 314; i++){
    float nextSine = aSin(i/5);
    qDebug() << "i: "<<QString::number(i)<<" sin(i/5) = nextSine: "<<nextSine;
}

这是我得到的结果示例:

i:  "303"  sin(i/5) = nextSine:  -0.304811
i:  "304"  sin(i/5) = nextSine:  -0.304811
i:  "305"  sin(i/5) = nextSine:  -0.966118
i:  "306"  sin(i/5) = nextSine:  -0.966118

有些时候是对的,但有些时候是错的,比如当i==303

4

2 回答 2

2

您可能希望在运行函数之前强制转换为浮点数:

float nextSine = aSin((float)i/5.0);
于 2014-05-25T03:08:32.127 回答
1

您在这里遇到这些问题:

1)您试图将整数除以 5,如果整数不能被 5 整除,则可能会丢失精度。例如,在您的情况下,313/5=62 而不是 62.6,但这只是其中的一个示例。解决方案是显式使用浮点数。

2) 你有一个不必要的 nextSine 变量。你可以在这里简单地消除它。

3)您的代码中有语法错误,因为您的意思是 **q**Sin,而不是 aSin。

4) 确保内联函数尽可能有效。

5)您正在尝试使用显式空间进行打印,但 qDebug 已经为您管理了这一点,因此您最终得到了两个而不是预期的一个。

所以,这是我个人会写的:

for (int i = 0; i < 314; ++i)
     qDebug() << "i:" <<QString::number(i)
              << " sin(i/5) = nextSine:" << qSin(static_cast<float>(i)/5);

或者

for (int i = 0; i < 314; ++i)
     qDebug() << "i:" <<QString::number(i)
              << " sin(i/5.0) = nextSine:" << qSin(i/5.0);

或者

for (float f = 0; f < 314.0; f+=1.0)
     qDebug() << "i:" <<QString::number(f, 'f')
              << " sin(f/5) = nextSine:" << qSin(f/5);
于 2014-05-25T03:46:26.137 回答