Math.sumPrecise в Chrome 145: точные суммы для финансов и ML в JS
-
В Chrome 145 появился Math.sumPrecise - метод для точного суммирования чисел в JavaScript. Он решает проблему ошибок плавающей точки, которая мешает в финансовых расчетах и машинном обучении. Теперь суммы массивов чисел вычисляются без потери точности.
Обычное сложение в JS часто дает неточные результаты из-за особенностей float64. Например, 0.1 + 0.2 не равно 0.3. Math.sumPrecise использует продвинутый алгоритм, чтобы избежать этого. Это упрощает код и повышает надежность приложений.
Как работает Math.sumPrecise
Math.sumPrecise принимает итерируемый объект с числами и возвращает их сумму с повышенной точностью. Алгоритм отличается от наивного reduce или цикла for. Он учитывает порядок и компенсацию ошибок округления.
Рассмотрим пример: массив [1e20, 0.1, -1e20]. Обычное сложение дает 0, потому что 1e20 + 0.1 округляется до 1e20. Затем 1e20 + (-1e20) = 0. Math.sumPrecise сохраняет малые значения и выдает 0.1. Это критично для финансов, где копейки важны.
В ML такие суммы используются для агрегации весов или градиентов. Неточности накапливаются в больших датасетах. Метод работает только с Number, выбрасывая TypeError на BigInt или строки.
- Плюсы алгоритма: Компенсирует ошибки округления, работает с пустыми итераторами (возвращает -0).
- Минусы: Медленнее наивного сложения, не для BigInt.
- Синтаксис:
Math.sumPrecise([1, 2, 3])вернет 6.
Обычное сложение Math.sumPrecise [1e20, 0.1, -1e20].reduce((a,b)=>a+b,0)= 0Math.sumPrecise([1e20, 0.1, -1e20])= 0.1[0.1, 0.2]= 0.30000000000000004[0.1, 0.2]= 0.30000000000000004 (из-за литералов)Пустой массив = 0 Пустой = -0 Применение в финансовых расчетах
В финтехе точность - ключевой фактор. Суммы транзакций, процентов или балансов не терпят ошибок. Math.sumPrecise упрощает код без нужды в библиотеках вроде decimal.js.
Представьте расчет итоговой суммы по чеку: тысячи позиций с ценами вроде 0.99. Обычный цикл потеряет гроши из-за накопления ошибок. Метод гарантирует точность до последнего знака. Важно: он не решает проблему представления 0.1, но минимизирует накопление.
В таблицах Excel или Google Sheets аналогичные проблемы решаются вручную. В JS теперь есть нативное решение. Тестировано в Test262, готово к продакшену.
- Сумма цен:
Math.sumPrecise(цены.map(p => p * qty))- без потерь. - Проценты: Агрегация ставок по портфелю без ошибок.
- Налоги: Расчет НДС или итогов с копейками.
Сценарий Без Math.sumPrecise С Math.sumPrecise 1000 транзакций по 0.01 Ошибка ~0.001 Точная сумма Баланс счета Округление в копейках Полная точность Итоговый чек reduce() = 99.99… 100.00 Использование в машинном обучении
В ML суммы нужны везде: от батч-нормализации до градиентного спуска. Большие датасеты усиливают floating point ошибки. Math.sumPrecise снижает шум в вычислениях.
Например, при усреднении фичей: сумма значений делится на длину. Неточности искажают модель. Метод обеспечивает стабильность на больших объемах данных. Поддержка в V8 через Finch флаг V8Flag_js_sum_precise.
В TensorFlow.js или простых нейронках это ускорит прототипирование. Не нужно переписывать циклы на Kahan summation. Работает с массивами, Set, Map.values().
- Градиенты:
Math.sumPrecise(градиенты)для обновления весов. - Loss функция: Точная агрегация ошибок по батчу.
- Нормализация: Сумма фичей без артефактов.
Поддержка браузеров и миграция
Chrome 145 первым внедряет Math.sumPrecise на десктопе. Safari поддерживает с 26.2, Firefox с 137. Edge и мобильный Chrome отстают.
Проверить:
typeof Math.sumPrecise !== 'undefined'. Для кросс-браузерности используйте полифилл или фолбэк на reduce. Пустой итерируемый дает -0 для совместимости с FP-идентичностью.Миграция проста: замените reduce на Math.sumPrecise в финансовом коде. Тестируйте на примерах с большими и малыми числами. Производительность приемлема для точности.
- Chrome: Desktop 145+, Android нет.
- Firefox: 137+.
- Safari: 26.2+.
Браузер Версия поддержки Chrome Desktop 145 Firefox 137 Safari 26.2 Edge Нет Точность на практике
Math.sumPrecise реализует алгоритм вроде xsum - с компенсацией ошибок. Он отслеживает низкие биты, не влезающие в mantissa. Для 1000+ чисел разница заметна.
В бенчмарках он медленнее наивного на 2-5x, но быстрее ручных Kahan. Идеален для финансов и ML, где скорость вторична точности. Пустой массив - -0, чтобы
sum([]) + x == sum(x).Не для высокопроизводительных циклов вроде игр. Там хватит обычного +. Отвергает не-числа, в отличие от Math.max.
- Финансы: Обязательно.
- ML: Рекомендуется.
- Общие скрипты: Опционально.
Перспективы развития JS
Math.sumPrecise - шаг TC39 к надежным вычислениям. Stage 3, тесты в Test262. Дальше ждем Math.maxPrecise или BigDecimal. Это меняет правила для числовых задач.
В Chrome 145 фокус на десктопе, мобильные платформы позже. Интеграция с WebAssembly возможна, но пока чистый JS. Стоит экспериментировать в проектах с данными.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.