Why is this an issue?
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 half-way 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’s 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);