Как «проверить контрольную сумму» массива зашумленных чисел с плавающей запятой?

Каков быстрый и простой способ «проверить контрольную сумму» массива чисел с плавающей запятой, допуская при этом указанную небольшую погрешность?

например, я есть два алгоритма, которые должны (теоретически с бесконечной точностью) выводить один и тот же массив. Но они работают по-разному, и поэтому ошибки с плавающей запятой будут накапливаться по-разному, хотя длины массивов должны быть точно такими же. Я хотел бы быстрый и простой способ проверить, кажутся ли массивы одинаковыми.Я, конечно, мог бы сравнить числа попарно и сообщить о максимальной ошибке, но один алгоритм находится в C++, а другой в Mathematica, и я не хочу заморачиваться записью числа в файл или вставка их из одной системы в другую. Вот почему я хочу простую контрольную сумму.

Я мог бы просто сложить все числа в массиве. Если длина массива равна N, и я могу допустить ошибку 0,0001 в каждом числе, то я бы проверил, abs(sum1-sum2)<0,0001*N. Но эта упрощенная «контрольная сумма» ненадежна, например. к ошибке +10 в одной записи и -10 в другой. (И вообще, теория вероятностей говорит, что ошибка, вероятно, растет как sqrt(N), а не как N.) Конечно, любая контрольная сумма представляет собой низкоразмерную сводку порции данных, поэтому она пропустит некоторыеошибки, если не большинство...но простые контрольные суммы, тем не менее, полезны для поиска ошибок типа ошибки, не являющихся злонамеренными.

Или я мог бы создать двумерную контрольную сумму, [sum(x[n]), sum(abs(x[n]))]. Но лучшее, что я могу сделать, то есть есть ли другая функция, которую я мог бы использовать, которая была бы «более ортогональной» к sum(x[n])? И если бы я использовал некоторые произвольные функции, например. [sum(f1(x[n])), sum(f2(x[n]))], то как моя «необработанная устойчивость к ошибкам» должна переводиться в «допуск ошибок контрольной суммы»?

Я программирую на C++, но буду рад увидеть ответы на любом языке.

5
задан andrew cooke 19 March 2012 в 03:25
поделиться