как лучше суммировать значения с плавающей запятой -unix sum: значение от 8 до 9 дает неверную сумму

Эта проблема отсутствует в более поздних версиях Deepin Linux.

0
28.04.2020, 20:53
4 ответа

С cvstoolиbc:

$ csvtool -t '|' col 2 A | paste -sd + - | bc
149.5073562464567
0
19.03.2021, 02:29

Это метод, основанный на команде dc (, при условии, что она имеет достаточную точность, скомпилированную в ). Он украшает второй столбец командами постоянного тока и работает с точностью до 60 -цифр (200 -битов ).

Это работает на 10 строках данных, предоставленных ранее, плюс пара экстремальных значений. Он показывает промежуточные суммы :, чтобы удалить их, удалите 'p' непосредственно перед \n, где awk выдает $2.

Paul--) cat awkToDc
#! /bin/bash

function Data { cat <<'EOF'
1|"12.8"|demo1
2|"13.5678341234567"|demo1
3|"14.578"|demo1
4|"15.58"|demo1
5|"16.56784"|demo1
6|"17.578"|demo1
7|"18.678"|demo1
8|"19.568890123"|demo1
9|"20.588792"|demo1
10|"55555555555555555555000000000000"|demo1
11|"20.588792"|demo1
12|"0.000000000000000000077777777777"|demo1
EOF
}

function dataDC {

    AWK='
BEGIN { FS = "\042"; printf ("60 k 0\n"); }
{ printf ("%s + p\n", $2); }
END { printf ("p q\n"); }
'
    awk "${AWK}"
}

Разъяснение по выдаваемым командам постоянного тока (, которые находятся в обратном порядке. обозначение):

'60k' задает арифметическую точность, а '0' инициализирует общее количество.
'+' добавить к сумме значение от $2. 'p' печатает промежуточную сумму для иллюстрации.
'p q' печатает окончательную сумму и завершает работу.

    Data | dataDC | dc

Paul--)./awkToDc
12.8
26.3678341234567
40.9458341234567
56.5258341234567
73.0936741234567
90.6716741234567
109.3496741234567
128.9185642464567
149.5073562464567
55555555555555555555000000000149.5073562464567
55555555555555555555000000000170.0961482464567
55555555555555555555000000000170.096148246456700000077777777777
55555555555555555555000000000170.096148246456700000077777777777
Paul--) 

Теперь у вас есть четыре проверенных метода (для вашего тестового файла из 722277 строк )с оценками точности.

Используя gawk с точностью 200 -бит,и dc с точностью до 60 -цифр, оба согласуются с одним и тем же общим числом в 33 -цифр, что, как я подозреваю, является точным.

25396577843.7560139069641121618832

Использование gawk со стандартной точностью IEEE (должно быть 15 или 16 цифр )согласуется только с первыми 12 из этих цифр. Я предполагаю, что миллион дополнений снижает точность, поскольку показатели степени становятся более непересекающимися.

25396577843.7769622802734375

Я нашел алгоритм рекурсивного сложения и в стандартном awk. Сначала добавляются значения в соответствии с последними 5 цифрами NR, чтобы получить 100 000 промежуточных итогов. Затем он суммирует их, уменьшая количество цифр до 4, 3, 2, 1 и, наконец, до одной суммы. Таким образом, каждое число получает только 60 дополнений. Этот результат согласуется с первыми 16 цифрами высокой точности -, что вполне ожидаемо.

25396577843.756011962890625

0
19.03.2021, 02:29

Вы не говорите размер файла (, т.е. сколько строк вы добавляете ). Загрузка потребовала 18,3 МБ, прежде чем сайт появился как «Опасный» и «Предупреждение о мошенничестве». Если средняя длина строки равна 18, то добавляется миллион чисел с плавающей запятой, и мы не знаем диапазон значений. Общее количество, которое вы показываете в вопросе, составляет 13,2 цифры, поэтому среднее значение в строке составляет около 7 цифр с неизвестной изменчивостью.

Если вы продолжаете добавлять такие значения, как 27,865326635297 к нарастающей сумме, которая приближается к 13 целым -числовым цифрам, то только 27,87 (округленная )часть попадет в итоговую сумму, потому что. 00532... выходит за пределы 15- или 16-значного диапазона результатов. Иногда эти ошибки компенсируются, иногда нет :арифметики Монте-Карло.

Проверьте выходные данные версии awk --. Если он упоминает MPFR и MP, ваш awk скомпилирован с расширенной -математической точностью. Вы просто добавляете -M 113 к своей команде awk. Это длина мантиссы, которая дает вам четырехкратную точность в реальной арифметике --33-значной точности.

www.gnu.org/software/gawk/manual/gawk.html #Произвольная -Точность -Арифметика

2
19.03.2021, 02:29

Проверьте Суммирование Кахана , оно пытается отслеживать ошибку округления и компенсирует ее. То, что нужно для таких огромных сумм.

0
19.03.2021, 02:29

Теги

Похожие вопросы