- double upper = x;
- double lower = x + 1;
- while (lower - upper > 1e-3) {
- double mid = 0.5f * (upper + lower);
- if (lanczos_interpolate(pcm, mid) > limit) {
- upper = mid;
- } else {
- lower = mid;
+ if (fast) {
+ // Do simple linear interpolation.
+ return x + (limit - pcm[x]) / (pcm[x + 1] - pcm[x]);
+ } else {
+ // Binary search for the zero crossing as given by Lanczos interpolation.
+ double upper = x;
+ double lower = x + 1;
+ while (lower - upper > 1e-3) {
+ double mid = 0.5f * (upper + lower);
+ if (lanczos_interpolate(pcm, mid) > limit) {
+ upper = mid;
+ } else {
+ lower = mid;
+ }