【问题标题】:qSin() giving wrong sin values?qSin() 给出错误的 sin 值?
【发布时间】:2014-07-14 03:12:58
【问题描述】:

我有代码:

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

【问题讨论】:

  • @KeithThompson:正如您在答案中看到的那样,这是一个错字。您还可以意识到qa 在键盘上彼此靠近,并且只打错了一次。也没有有效的 aSin 函数。
  • @LaszloPapp:很有可能,但关键是要引起 OP 的注意。
  • @KeithThompson:是的,我同意,因此我也已经这样做了。 :)
  • @JVE999:顺便说一句,有什么理由使用 qSin 代替 std::sin?
  • 我只是想保证可维护性和交叉编译性,所以随着 Qt 的更新,我想代码会更容易更新并且一切都会保持一致。

标签: c++ qt qtcore qdebug qtmath


【解决方案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);

【讨论】:

  • qsin 需要一个 qreal,因此最好强制转换为 qreal 或在整个过程中使用 qreal 而不是 float。
  • @cup:没有必要这样做。浮点数对 qreal 来说很好。其实想法是在Qt中越来越少使用qreal。它最终应该会消失。它已经没有那么多用处了。
  • 我没有考虑 float for 循环。凉爽的!我制作了一个单独的 nextSine 以使处理更容易。它会影响处理速度吗(这是在动画中)?如果可以这样写的话,这似乎比试图把所有东西都写在一行上要好。
  • 在这种情况下最后一个循环是可以的,尽管通常人们应该对使用浮点循环计数器非常谨慎,因为您可能会得到不同数量的迭代。例如,使用替换 for (float f = 0.0f; f &lt; 62.8f; f += 0.2f) 使 f = i/5.0 不等价。
  • @JVE999:将中间值存储在块局部变量中不会降低性能。无论如何,编译器都会临时保存它。
【解决方案2】:

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

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

【讨论】:

  • 只要使用 5.0 就足够了,因为你想要双精度。
  • 我想说我在 chris 发表评论后使用了 5.0
  • @JVE999:这很糟糕。如果可能的话,我个人会在 C++ 中使用类型安全的强制转换。与 C 相比,这是一个很好的补充。
猜你喜欢
  • 2014-05-08
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 2012-05-03
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
相关资源
最近更新 更多