C++20 introduced the standard algorithms to compute the midpoint between two values and linear interpolation for a given coefficient.
std::midpoint(a, b)
computes the midpoint, or average, or arithmetic mean of two values a
and b
:
(a+b)/2
. The result is halfway from a
to b
, and if a
and b
are pointers, it points to
the middle of a contiguous memory segment between the two. A naive midpoint computation might suffer from a possible overflow or be inefficient. That
is why, in most cases, std::midpoint
is preferable.
std::lerp(a, b, t)
returns linear interpolation between values a
and b
with a coefficient t
:
a+t*(a-b)
, where t
is between 0 and 1.
This rule reports computations that should be replaced with std::midpoint
or std::lerp
.
Noncompliant code example
auto avg1 = (a + b)/2; // Noncompliant: might overflow
auto avg2 = a + (b - a)/2; // Noncompliant
auto third = a + (b - a)*0.3f; // Noncompliant
Compliant solution
auto avg1 = std::midpoint(a, b);
auto avg2 = std::midpoint(a, b);
auto third = std::lerp(a, b, 0.3f);