là việc bổ sung x + x
hoán đổi cho nhau bởi những nhân 2 * x
trong IEEE 754 (IEC 559) dấu chấm động chuẩn, hoặc tổng quát hơn nói là có gì đảm bảo rằng case_add
và case_mul
luôn cho kết quả chính xác giống nhau?năng hoán đổi của IEEE 754 floating-point cộng và phép nhân
#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);
}
Lưu ý rằng hình như vẫn có nhiều cách để tổng hợp n * x, nhưng đáng ngạc nhiên rất nhiều tương đương! Đây là bằng cách nào đó liên quan đến http://stackoverflow.com/questions/21690585/is-3xx-always-exact và http://stackoverflow.com/questions/21676955/floating-point-product-expansion-equivalence –