Math.sqrt () возвращает бесконечность? - PullRequest
2 голосов
/ 26 марта 2012

Math.sqrt();, кажется, хорошо работает с любым числом длиной менее 310 символов.

Однако, любое число 310 символов или более вернет бесконечность ...

Если вы хотите проверить это сами, здесь это на jsfiddle http://jsfiddle.net/gqhk9/2

Во всяком случае, мне нужно получить квадратный корень из числа, включая некоторые, которые 310 символов и более.

Как я могу это сделать в js?

Ответы [ 4 ]

8 голосов
/ 26 марта 2012

Это не проблема с Math.sqrt - избавьтесь от вызова Math.sqrt, и вы все еще увидите бесконечность.По сути, Javascript не может справиться с такими большими числами - он выходит за пределы диапазона 64-битных значений IEEE 754 с плавающей запятой.Вам нужно будет найти какую-то библиотеку для обработки целых чисел произвольного размера.

Обратите внимание, что даже для чисел, меньших 10 309 , вы все равно будете терять информацию послепервые ~ 15 цифр.Если вам небезразличны все эти цифры, вам снова следует обратиться к специализированным математическим библиотекам.

При быстром просмотре веб-страниц найдены ссылки BigInt.js, но я нене знаю, как это хорошо.

2 голосов
/ 26 марта 2012

Посмотрите на Number.MAX_VALUE.

  • Свойство MAX_VALUE имеет значение приблизительно 1,79E + 308.
  • Значения больше MAX_VALUE представлены как «Бесконечность» .
1 голос
/ 26 марта 2012

Число, которое вы начинаете с, 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890, является Infinity, и Math.sqrt(Infinity) есть Infinity.

1005 * Что вам нужно, это большое число библиотека, чтобы имитировать его, например, http://www.leemon.com/crypto/BigInt.html;, затем вы можете взять свое большое целое число до степени 0,5 для вычисления квадратного корня.
1 голос
/ 26 марта 2012

Числа Javascript не могут быть такими большими.

Если вы введете

javascript:123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890

в адресной строке, вы также получитеInfinity.

Вам необходимо использовать библиотеку bignum.

...