Редко все значащие биты числа двойной точности.
Если у вас есть миллиарды значений, которые являются результатом какого-либо измерения, найдите калибровку и ошибку вашего измерительного устройства. Квантовать значения так, чтобы вы работали только со значимыми битами.
Часто вы обнаружите, что вам нужен только 16 бит фактического динамического диапазона. Вы, вероятно, можете сжать все это в массивы "short", которые сохранят все исходные данные.
Используйте простую «технику Z-счета», где каждое значение действительно является знаком стандартной дроби со знаком.
Таким образом, последовательность выборок со средним значением m и стандартным отклонением s преобразуется в группу значений Z. Обычные преобразования Z-счета используют двойное число, но вы должны использовать версию этого двойного с фиксированной запятой. s / 1000 или s / 16384 или что-то, что сохраняет только фактическую точность ваших данных, а не шумовые биты на конце.
for u in samples:
z = int( 16384*(u-m)/s )
for z in scaled_samples:
u = s*(z/16384.0)+m
Ваши Z-показатели сохраняют приятную простоту в работе со статистической взаимосвязью с исходными образцами.
Допустим, вы используете подписанный 16-битный Z-счет. У вас есть +/- 32,768. Масштабируйте это до 16384, и ваши Z-показатели имеют эффективное разрешение 0,000061 десятичного.
Если вы используете подписанный 24-но Z-счет, у вас +/- 8 миллионов. Масштабируйте это до 4,194,304, и у вас будет разрешение 0,00000024.
Я серьезно сомневаюсь, что у вас есть точные измерительные приборы. Кроме того, любая арифметика, выполняемая как часть фильтра, калибровки или уменьшения шума, может уменьшить эффективный диапазон из-за битов шума, введенных во время арифметики. Плохо продуманный оператор деления может превратить множество ваших десятичных знаков в не более чем шум.