2013-01-31
ryg writes about lerp:
http://fgiesen.wordpress.com/2012/08/15/linear-interpolation-past-present-and-future/
lerp_1 is considered the robust formulation, but I ran into a practical problem with it in my work. My colleague Travis Heppe suggested this alternative (in Javascript for convenience):
---- function lerp_3(t, a, b) { var bma = b - a; if (t < 0.5) { return a + bma * t; } else { return b - bma * (1 - t); } } ----
Which seems to meet all my criteria. A JS console session showing test cases:
---- function lerp_1(t, a, b) { return (1 - t)*a + t*b; } function lerp_2(t, a, b) { return a + t * (b - a); } function lerp_3(t, a, b) { var bma = b - a; if (t < 0.5) { return a + bma * t; } else { return b - bma * (1 - t); } } // lerp_1 failure case: lerp_1(5.0586262771736122e-15, 127, 127); // --> 126.99999999999999 lerp_2(5.0586262771736122e-15, 127, 127); // --> 127 lerp_3(5.0586262771736122e-15, 127, 127); // --> 127 // lerp_2 failure case: lerp_1(1, 1.1805916083717324e+21, 0.000001430511474609375); // --> 0.000001430511474609375 lerp_2(1, 1.1805916083717324e+21, 0.000001430511474609375); // --> 0 lerp_3(1, 1.1805916083717324e+21, 0.000001430511474609375); // --> 0.000001430511474609375 // [added 2013-02-14] // An even simpler lerp_1 failure case, thanks to Morton Ofstad: lerp_1(0.4, 1.7, 1.7) // --> 1.7000000000000002 ----
tu@tulrich.com