qSin()给出错误的罪恶值?

时间:2014-05-25 03:03:09

标签: c++ qt qtcore qdebug qtmath

我有代码:

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

2 个答案:

答案 0 :(得分:2)

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

float nextSine = aSin((float)i/5.0);

答案 1 :(得分:1)

这里有这些问题:

1)你试图将整数除以5,如果整数不能被5整除,可能会失去精度。例如313/5 = 62而不是62.6,但这只是一个例子那些。解决方案是明确使用float。

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