gpt4 book ai didi

c++ - 如何提高 std::sin 函数在 iOS 上的精度

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:10:22 26 4
gpt4 key购买 nike

我有一个跨平台应用程序,它是一个音频应用程序,因此大量使用正弦波、std::sin() 和其他测角函数。

我注意到,特别是在 iOS 平台上,std::sin() 的精度非常差。我写了以下测试:

void TestSineZeroCrossings()
{
const static float kTwoPi = 6.28318530718f;
const static float epsilon = 1e-5f;

for (int ii = 0; ii < 10000; ++ii)
{
const float difference = std::abs(std::sin(kTwoPi * static_cast<float>(ii)));
if (difference > epsilon)
printf("Zero crossing fail, difference: %f\n", difference);
}
}

在 Windows 和 MaxOSX 上,这会通过(即没有打印输出),但在 iOS 上,这几乎每次迭代都会失败。事实上,只有 epsilon > 0.004f 才会成功。这导致我的应用程序中出现清晰可闻的噪音。

有没有办法告诉编译器使用一个没有那么有损的更好的实现?

最佳答案

我认为实现是相当准确的。

您的实际问题是 kTwoPi * static_cast<float>(ii)四舍五入到下一个 float .例如,对于 ii=10000值是(如果我没有算错的话):62831.8515625如果减去 10000*2*pi在精确的数学中你可以得到大约:-0.001509...并且该值的正弦值大致相同(而不是 0 )。它“相对”接近于零但远离您想要的 10e-6 “准确性”。

如果您想为 sin(x*pi) 获得更准确的值,看看boost::math::sin_pi : https://www.boost.org/doc/libs/1_69_0/libs/math/doc/html/math_toolkit/powers/sin_pi.html

关于c++ - 如何提高 std::sin 函数在 iOS 上的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54949786/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com