2016-05-18 5 views
1

Допустим, вам нужно добавить 32-битные номера фиксированной точки, хранящиеся в огромном массиве L, и вы хотите получить наиболее точный результат результат как можно скорее. Кроме того, вам не разрешено использовать ничего, кроме L и 32-битных чисел с фиксированной точкой (т. Е. Вам не разрешено преобразовывать их в 64-разрядные). Каким будет ваш подход к получению наиболее точного результата для суммы чисел в L?Вычисление наиболее точного результата для: суммы списка нумеров с фиксированной точкой

Это будет мой текущий подход отметил в коде Sudo:

L = sort(L) 
result = 0 
lastMax = false -- indicates whether we've extracted the maximum from L last time 

while (not empty(L)) and (result not equals +INF or -INF) do: 
    current = 0 
    if lastMax: 
    current = extractMin(L) -- gets and removes minimum from L 
    else: 
    current = extractMax(L) -- gets and removes maximum from L 
    result = safeAdd(result, current) 
    lastMax = not lastMax 

safeAdd(a,b): 
    if a = +INF: return +INF 
    else if a = -INF: return -INF 
    else: return a + b 

Так что я чередующихся между добавлением минимального/максимального значения из оставшегося списка L, чтобы остаться между диапазонами L. Кстати как реализовано safeAdd, показывает, что как только мы пересекли диапазоны точности (т. е. результат a+b дал +INF или -INF - так же, как это делается на C), мы больше не будем изменять результат.

Есть ли у вас предложения по улучшению подхода?

Sidenote: Если мы хотим быть очень точным: Кроме того, мы предполагаем, что + операция может дать +INF или -INF, которые могут быть представлены в виде чисел с фиксированной точкой в ​​языке программирования. Но мы предполагаем, что значения +INF, -INF не встречаются в L. И мы игнорируем тот факт, что стандарт фиксированной точки также может иметь представление для NaN.

+0

Рассматривали вы [Каган суммирование] (https://en.wikipedia.org/wiki/Kahan_summation_algorithm)? –

+0

Спасибо за подсказку! Извините, но мне просто пришлось сменить вопрос с плавающей точкой на номера фиксированной точки. Так что это может быть не актуально. – ndrizza

+0

@ndrizza Добавление с фиксированной точкой - это просто добавление целых чисел, поэтому в этой операции (то есть, это точно) не возникает ошибка, если нет переполнения, что является несколько иной проблемой, которая может быть устранена путем повторного масштабирования в зависимости от варианта использования , Обычно используемые форматы с фиксированной точкой не обеспечивают представления бесконечности. – njuffa

ответ

0

Если вы знаете, что результат находится в радиусе действия, вам не нужно заботиться о переполнении или потоке.

Вот пример с 4 битами только держать его просто

7 0111 
+1 0001 
= 1000 <-- -8 overflow 
-1 0001 
= 0111 

Если вы не уверены, если результат находится в диапазоне, вы должны рассчитывать переполняется и недорасход.

При а = Ь + с

переполнению, если б и положительные и отрицательный

Underflow если б и отрицательные, а положительный

 Смежные вопросы

  • Нет связанных вопросов^_^