Уменьшить ошибочно возвращаемую бесконечность

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

const array1 = [1,2,3,4];

const initialValue = 0;
const sumWithInitial = array1.reduce(
  (a,b) => a + Math.pow(b, b + a),
  0
);

console.info(sumWithInitial);

Но если в arr1 всего 1-3 числа, все работает как задумано

Запуск функции с [1,2,3] дает 531450. В четвертой итерации формула в вашей функции сокращения будет 531450 + 4^(531450 + 4). Полученное число просто слишком велико и, следовательно, является Infinity для JS.

Palladium02 17.02.2023 13:26

Потому что число такое большое? Я не уверен, что вы ожидаете. На последнем шаге Math.pow(b, b + a) имеет b = 4 и a = 531450`, значит, 4 возводится в степень 531454.

VLAZ 17.02.2023 13:27
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
Введение в раздел "Заголовок" в HTML
Введение в раздел "Заголовок" в HTML
Говорят, что лучшее о человеке можно увидеть только изнутри, и это относится и к веб-страницам HTML! Причина, по которой некоторые веб-страницы не...
Как React Helmet спасает меня при разделении файлов CSS?
Как React Helmet спасает меня при разделении файлов CSS?
Многие новички могут столкнуться с проблемой, когда одна страница с CSS наследует свойства от другой страницы с другим CSS. У меня было много проблем,...
1
2
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

На последней итерации вы превысили емкость типа JavaScript число (который является двоичным значением с плавающей запятой двойной точности IEEE-754). Это не имеет ничего общего с reduce, просто Math.pow(4, 4 + 531450) (последнее значение, созданное вашим циклом reduce) превышает предел:

console.info(Math.pow(4, 4 + 531450));

Вы можете увидеть, когда pow сделает это, с помощью абстрактной операции Number::expontiate в спецификации (в тексте бесконечность обозначается +∞𝔽, отрицательная бесконечность -∞𝔽). Это просто попытка использовать 64-битное значение, чтобы попытаться представить действительно, действительно, действительно огромное число.

Если вам нужно иметь дело с такими величинами и вам нужны только целые значения, вы можете использовать BigInt , как указывает Келдан Чепмен .

Как объясняли другие, вы получаете бесконечность из-за превышения лимита. Но если вы хотите получить фактический результат, вы можете использовать операции BigInt:

const array1 = [1n, 2n, 3n, 4n];

const initialValue = 0n;
const sumWithInitial = array1.reduce(
    (a, b) => a + b**(b + a),
    initialValue
);

console.info(sumWithInitial.toString());

Хорошая мысль о BigInt, однако. Не знаю, почему я не назвал это.

T.J. Crowder 17.02.2023 13:58

Правильно, я неправильно прочитал существующие комментарии/сообщения. Исправлено здесь, чтобы избежать путаницы.

Keldan Chapman 17.02.2023 14:06

Другие вопросы по теме