Численная точность в суммирующей функции [дубликат]

Вы также можете использовать регулярное выражение ... это будет выглядеть так:

SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+$';

Ссылка: http://dev.mysql.com/doc/refman/5.1/en/ regexp.html

32
задан martinus 29 December 2008 в 22:31
поделиться

5 ответов

Для «более точного»: этот рецепт в поваренной книге Python содержит алгоритмы суммирования, которые сохраняют полную точность (отслеживая промежуточные итоги). Код находится в Python, но даже если вы не знаете Python, достаточно ясно приспособиться к любому другому языку.

Все подробности приведены в этой статье .

24
ответ дан dF. 27 August 2018 в 01:31
поделиться
  • 1
    удивительный ответ, мгновенная победа! – martinus 26 December 2008 в 20:51
  • 2
    очень приятно. – duffymo 26 December 2008 в 21:01
  • 3
    так как я не парень-питон, что делают частичные [i:] = [x]? – martinus 26 December 2008 в 21:32
  • 4
    partials [i:] - фрагмент списка (с именем partials). Это часть списка из индекса i в конец списка. aList [i:] = [x] - отрезать часть списка за i-м элементом и заменить его на [x] (список содержит только x) – Abgan 26 December 2008 в 22:32
  • 5
    @martinus: partials[i:] = [x] заменяет срез partials[i:] одним списком [x]. Например: a = [0,1,2,3,4]; assert a[2:] == [2,3,4]; a[2:] = [-1]; assert a[2:] == [-1] and a == [0,1,-1]. – jfs 26 December 2008 в 22:34

Существует много алгоритмов, в зависимости от того, что вы хотите. Обычно они требуют отслеживания частичных сумм. Если вы сохраните только суммы x [k + 1] - x [k], вы получите алгоритм Кахана. Если вы отследите все частичные суммы (следовательно, получив алгоритм O (n ^ 2)), вы получите ответ @dF.

Обратите внимание, что дополнительно к вашей проблеме суммирование чисел отличается Знаки очень проблематичны.

Теперь есть более простые рецепты, чем отслеживание всех частичных сумм:

  • Сортировка чисел перед суммированием, суммирование всех негативов и положительных результатов независимо. Если вы отсортировали числа, отлично, в противном случае вы получите алгоритм O (n log n). Суммируйте по возрастающей величине.
  • Суммируйте по парам, затем парам пар и т. Д.

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

2
ответ дан Alexandre C. 27 August 2018 в 01:31
поделиться

Если ваше приложение полагается на поиск числовой обработки для произвольной арифметической библиотеки точности, однако я не знаю, существуют ли библиотеки Python такого типа. Конечно, все зависит от того, сколько цифр точности вы хотите - вы можете добиться хороших результатов со стандартной плавающей точкой IEEE, если будете использовать ее с осторожностью.

0
ответ дан Hernán 27 August 2018 в 01:31
поделиться

См. также: алгоритм суммирования Kahan Он не требует хранения O (n), а только O (1).

12
ответ дан quant_dev 27 August 2018 в 01:31
поделиться
  • 1
    Технически это, возможно, не самый точный ответ на вопрос, но я нашел его гораздо более полезным на практике. Это O (n) во времени и O (1) в хранилище, то же самое, что и исходный наивный код, поэтому нет причин не использовать этот алгоритм, по крайней мере, при суммировании чисел. – flodin 13 June 2010 в 09:08

Ну, если вы не хотите сортировать, то вы можете просто сохранить общее количество в переменной с типом более высокой точности, чем отдельные значения (например, использовать двойной для сохранения суммы поплавков или «квадрат») чтобы сохранить сумму удвоений). Это наложит штраф за производительность, но это может быть меньше стоимости сортировки.

0
ответ дан Wedge 27 August 2018 в 01:31
поделиться
Другие вопросы по тегам:

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