I have a cross-platform application, which is an audio application and therefore uses sine waves a lot, and the std::sin()
and other goniometric functions.
I noticed that particularly on the iOS platform, the precision of the std::sin()
is extremely poor. I wrote the following test:
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);
}
}
On Windows and MaxOSX this passes (i.e. no print-outs), but on iOS this fails on pretty much every iteration. In fact, only with an epsilon > 0.004f
does it succeed. That results in clearly audible noise in my application.
Is there a way to tell the compiler to use a better implementation that's not as lossy?
Sid S :
If you want more precision, use double or long double rather than float.\n\nFor instance,\n\nreplace\n\n const static float kTwoPi = 6.28318530718f;\n const static float epsilon = 10e-6f;\n\n\nwith\n\n const static double kTwoPi = 6.28318530718;\n const static double epsilon = 10e-6;\n\n\nand\n\nconst float difference = std::abs(std::sin(kTwoPi * static_cast<float>(ii)));\n\n\nwith\n\nconst double difference = std::abs(std::sin(kTwoPi * ii));\n",
2019-03-01T18:13:38
chtz :
I would assume the implementation is quite accurate.\n\nYour actual problem is that kTwoPi * static_cast<float>(ii) gets rounded to the next float. E.g., for ii=10000 the value is (if I did not miscalculate): 62831.8515625\nIf you subtract 10000*2*pi in exact math from that you get approximately: -0.001509... And the sine of that value is approximately the same (and not 0). It is \"relatively\" close to zero but far away from your desired 10e-6 \"accuracy\".\n\nIf you want to have more accurate values for sin(x*pi), have a look at boost::math::sin_pi:\nhttps://www.boost.org/doc/libs/1_69_0/libs/math/doc/html/math_toolkit/powers/sin_pi.html",
2019-03-01T18:11:59