В плавающей точке IEEE 754 возможно, что
a*(b-c) != a*b-a*c // a, b, c double
Таким образом, разложение продукта не гарантируется равным нерасширенному произведению.
Но как насчет этого:
a*(b1+b2+...+bn) == a*b1+a*b2+...+a*bn // b1==b2==...==bn
Когда все b
равны, гарантирована ли эквивалентность (в случае отсутствия недо-/переполнения)? Есть ли разница, если во время компиляции известно равенство b
или нет?
Edit:
Это не - см. Эрик Постщил и Паскаль Куок.
Но, возможно, имеет более слабое утверждение?:
(1.0/n)*(b1+b2+...+bn) <= 1.0
&& (1.0/n)*b1+(1.0/n)*b2+...+(1.0/n)*bn <= 1.0
// when all b<=1.0 and n integral double but not power of 2
// so that 1.0/n not exactly representable with base-2 floating point
Я просто задаюсь вопросом, можете ли вы гарантировать, что среднее значение набора данных не превышает некоторого значения, которое также не будет превышено каждым значением данных независимо от того, как вы вычисляете среднее значение (сначала добавляете и деляете, или добавляете каждый значение разделено).
Edit2:
Хорошо, &&
не выполняется. См. Eric Postpischil и David Hammen:
average of nine 1.0 -> only first condition is true, second exceeds.
average of ten 1.0/3 -> only second condition is true, first exceeds.
Является ли тогда оптимальным методом вычисления среднего значения верхнего ожидаемого предела набора данных? Или также размер (что означает n
) набора данных? Или нет оптимального метода, который, безусловно, существует?