X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=qscale.c;h=1b3ab57c0b9bd20a76785d66caac745b445a774c;hb=0f5c62013c0210e1f9806342eb1271674f735d7d;hp=6d529bcb4d1d73c49b314eb036b54915fc7dd258;hpb=85edeac1ae18442aa7dc43074a2e4ddc31b6a731;p=qscale diff --git a/qscale.c b/qscale.c index 6d529bc..1b3ab57 100644 --- a/qscale.c +++ b/qscale.c @@ -9,11 +9,18 @@ double sinc(double x) { - // This is bad for very small x, should use power series instead. - if (x == 0.0) - return 1.0; - else + static const double eps = 2.22045e-016; + static const double cutoff = sqrt(sqrt(eps)); + + if (abs(x) < cutoff) { + // For small |x|, use Taylor series instead + const double x2 = x * x; + const double x4 = x2 * x2; + + return 1.0 - x2 / 6.0 + x4 / 120.0; + } else { return sin(x) / x; + } } double lanczos_tap(double x)