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

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

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

    Chrome 145 принес новый метод Math.sumPrecise(), который решает проблему неточных сумм в JavaScript. Он работает с iterable чисел и возвращает сумму без потерь точности от промежуточных вычислений. Это важно для финансовых расчетов и машинного обучения, где погрешности floating point могут искажать данные.

    Обычное сложение в цикле или через reduce() накапливает ошибки округления. Например, сумма [1e20, 0.1, -1e20] дает 0 вместо 0.1. Math.sumPrecise() использует продвинутый алгоритм, чтобы избежать этого. Теперь разработчики получают точные результаты без самописных решений.

    Что такое Math.sumPrecise и почему он нужен

    JavaScript использует 64-битные числа с плавающей запятой IEEE 754. Они не могут точно представить многие десятичные дроби, как 0.1 или 0.2. При суммировании ошибки накапливаются: 0.1 + 0.2 дает 0.30000000000000004 вместо 0.3. В финансовых приложениях это приводит к расхождениям в копейках, а в ML - к неверным весам моделей.

    Метод Math.sumPrecise() принимает iterable (массив, Set или генератор) и суммирует элементы с высокой точностью. Он медленнее обычного сложения, но точнее. Это статический метод Math, вызывается как Math.sumPrecise([1, 2, 3]). Алгоритм минимизирует потерю точности в промежуточных шагах, группируя мелкие и крупные числа.

    Вот классический пример проблемы:

    let sum = 0;
    const numbers = [1e20, 0.1, -1e20];
    for (const number of numbers) {
      sum += number;
    }
    console.log(sum); // 0 вместо 0.1
    

    С Math.sumPrecise():

    console.log(Math.sumPrecise([1e20, 0.1, -1e20])); // 0.1
    
    • Преимущество 1: Автоматически сортирует числа по модулю для компенсации ошибок.
    • Преимущество 2: Работает с любыми iterable, включая BigInt частично.
    • Преимущество 3: Не меняет исходные данные - чистая функция без мутаций.
    • Нюанс: Медленнее на больших массивах - используйте для точности, а не скорости.
    Обычное сложение Math.sumPrecise()
    Быстрое Медленнее
    Потери точности Высокая точность
    Цикл или reduce() Один вызов
    Пример: 0 Пример: 0.1

    Применение в финансовых расчетах

    В финтехе суммы транзакций должны быть точными до копейки. Обычные циклы дают расхождения при курсах валют или процентах. Math.sumPrecise() позволяет суммировать списки цен без ошибок. Представьте корзину покупок с тысячами позиций - итоговая сумма будет верной.

    Другой кейс - начисление процентов по вкладам. Малые добавки за день накапливаются годами, и погрешность растет. Метод решает это, используя compensated summation. В коде это упрощает валидацию: сумма всех платежей равна балансу.

    Практические примеры:

    const transactions = [100.1, 200.2, -150.05];
    const total = Math.sumPrecise(transactions); // Точно 150.25
    

    Для валют:

    const rates = [1.2345, 0.9876, 1.1123];
    const sumRates = Math.sumPrecise(rates); // Без накопленных ошибок
    
    • Кейс 1: Сумма комиссий в торговом боте - точность до 8 знаков.
    • Кейс 2: Агрегация отчетов по кварталам - миллиарды без потерь.
    • Кейс 3: Конвертация валют с динамическими курсами.
    • Совет: Комбинируйте с BigDecimal библиотеками для сверхточности.
    Сценарий Проблема без метода Решение с Math.sumPrecise
    Транзакции Расхождение в копейках Точная сумма
    Проценты Накопление ошибок Compensated алгоритм
    Отчеты Различия в Excel Совпадение с сервером

    Math.sumPrecise в машинном обучении

    В ML данные часто включают floats с градиентами и весами. Суммирование батчей может искажать loss function. Math.sumPrecise() дает стабильные результаты при обучении моделей в браузере, как в TensorFlow.js. Это критично для edge-вычислений на устройствах.

    При агрегации фич или loss по эпохам погрешность влияет на сходимость. Метод обеспечивает воспроизводимость: один и тот же датасет дает одинаковые метрики. В реальном проекте - сумма вероятностей в softmax без артефактов.

    Код для градиентов:

    const gradients = [0.0001, -0.0002, 0.00015];
    const totalGrad = Math.sumPrecise(gradients); // Точно без rounding
    

    Для loss:

    const losses = [0.123, 0.456, 0.789];
    const avgLoss = Math.sumPrecise(losses) / losses.length;
    
    • Кейс 1: Сумма ошибок в батче - стабильная оптимизация.
    • Кейс 2: Нормализация фич - точные коэффициенты.
    • Кейс 3: Веб-ML на мобильных - меньше артефактов.
    • Нюанс: На больших датасетах тестируйте производительность.
    Задача ML Обычный reduce() Math.sumPrecise()
    Loss aggregation Нестабильная сходимость Воспроизводимо
    Gradient sum Погрешность в 1e-10 Точность до 1e-16
    Feature scaling Искажения Линейность

    Поддержка и переход на новый метод

    Chrome 145 первым внедрил Math.sumPrecise() в начале 2026. Firefox 137 и Safari 26.2 последуют позже. Проверяйте поддержку через feature detection. Пока используйте полифиллы из core-js для кросс-браузерности.

    В проектах замените reduce() на новый метод в финансовых модулях. Тестируйте на реальных данных - разница видна сразу. Для legacy-кода оставьте фоллбэк.

    if (typeof Math.sumPrecise === 'function') {
      return Math.sumPrecise(numbers);
    } else {
      // Полифилл или старый reduce
    }
    
    • Браузеры: Chrome 145+, Firefox 137+, Safari 26.2+.
    • Полифилл: core-js/actual/Math.sumPrecise.
    • Тест: Сравните с ручным BigDecimal.

    Метод не решает все проблемы float, но упрощает жизнь. Дальше ждем Number.fromString и другие точные API. Стоит поэкспериментировать в прототипах.

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

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

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

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

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

    Категории

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

    Контакты

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

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

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

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

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