является добавление x + x
взаимозаменяемы размножением 2 * x
в IEEE 754 (IEC 559) с плавающей точкой стандарта, или вообще говоря, нет никаких гарантий, что case_add
и case_mul
всегда дают точно такой же результат?Взаимозаменяемость IEEE 754 с плавающей точкой сложения и умножения
#include <limits>
template <typename T>
T case_add(T x, size_t n)
{
static_assert(std::numeric_limits<T>::is_iec559, "invalid type");
T result(x);
for (size_t i = 1; i < n; ++i)
{
result += x;
}
return result;
}
template <typename T>
T case_mul(T x, size_t n)
{
static_assert(std::numeric_limits<T>::is_iec559, "invalid type");
return x * static_cast<T>(n);
}
Обратите внимание, что там, кажется, много способов обобщающих п * х, но удивительно так много эквивалентны! Это как-то связано с http://stackoverflow.com/questions/21690585/is-3xx-always-exact и http://stackoverflow.com/questions/21676955/floating-point-product-expansion-equivalence –