Ist der Zusatz x + x
austauschbar durch die Multiplikation 2 * x
in 754 IEEE (IEC 559)-Gleitkommastandard, oder allgemeiner gesagt gibt es keine Garantie, dass case_add
und case_mul
immer geben genau das gleiche Ergebnis?Austauschbarkeit der IEEE 754 Gleitkomma-Addition und Multiplikation
#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);
}
Hinweis ist, dass es scheinen viele Möglichkeiten, um es zusammenzufassen n * x, aber überraschend so viele sind gleichwertig! Das hängt irgendwie mit http://stackoverflow.com/questions/21690585/is-3xx-always-exact und http://stackoverflow.com/questions/21676955/floating-point-product-expansion-equivalence zusammen –