Перейти к содержанию
  • Лента
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
exlends
Категории
  1. Главная
  2. Категории
  3. Языки программирования
  4. JavaScript
  5. Math.sumPrecise в Chrome 145: точные суммы для финансов и ML в JS

Math.sumPrecise в Chrome 145: точные суммы для финансов и ML в JS

Запланировано Прикреплена Закрыта Перенесена JavaScript
math.sumprecisechrome 145точные суммы
1 Сообщения 1 Постеры 14 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • hannadevH Не в сети
    hannadevH Не в сети
    hannadev
    написал в отредактировано
    #1

    В 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) = 0 Math.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. Стоит экспериментировать в проектах с данными.

    1 ответ Последний ответ
    0

    Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.

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

    С вашими комментариями этот пост мог бы стать ещё лучше 💗

    Зарегистрироваться Войти

    Категории

    • Главная
    • Новости
    • Фронтенд
    • Бекенд
    • Языки программирования

    Контакты

    • Сотрудничество
    • info@exlends.com

    © 2024 - 2026 ExLends, Inc. Все права защищены.

    Политика конфиденциальности
    • Войти

    • Нет учётной записи? Зарегистрироваться

    • Войдите или зарегистрируйтесь для поиска.
    • Первое сообщение
      Последнее сообщение
    0
    • Лента
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы