Как я могу получить точную строку значений огромных чисел в JavaScript?

Я знаю, что числа JavaScript - это просто «двойные» числа и имеют только 52-битную точность для дробной части. Тем не менее, НАСТОЯЩИЕ числа JavaScript, кажется, имеют более практичную точность для огромных чисел.

Например, предопределенная константа Number.MAX_VALUE представляет наибольшее положительное конечное значение типа Number, которое приблизительно равно 1,7976931348623157e+308. Здесь я могу получить доступ к конечным цифрам этого значения с помощью оператора модуля.

> Number.MAX_VALUE
1.7976931348623157e+308
> Number.MAX_VALUE % 10000000000
4124858368

Из этого результата я могу предположить, что это число равно 7fef ffff ffff ffff, что представляет собой (1 + (1 − 2 ** −52)) × 2 ** 1023 (Wikipedia) и может быть записано в точной форме следующим образом:

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

... и мы увидели только 10 последних цифр из этих 309 цифр. Поэтому я думаю, что каждое число JavaScript должно иметь точные цифры в десятичной форме.

Мой вопрос: как получить эту строку из 309 цифр в JavaScript? Такие вызовы, как Number.MAX_VALUE / 10000000000 % 10000000000, просто терпят неудачу из-за такой огромности.

Кроме того, как насчет крошечных чисел, таких как Number.MIN_VALUE? Это должна быть следующая дробь в десятичной форме.

0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625

person hakatashi    schedule 15.03.2015    source источник
comment
Ваши предположения неверны. Числа JavaScript — это 64-битные числа с плавающей запятой, вот и все.   -  person Pointy    schedule 15.03.2015
comment
Попробуйте это в своей консоли JavaScript: (1e25+1) === 1e25   -  person Pointy    schedule 15.03.2015


Ответы (2)


Все цифры MAX_VALUE: 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Проверьте код ниже:

http://howjs.com/?%3Aload%20http%3A%2F%2Fwww.javascriptoo.com%2Fapplication%2Fhtml%2Fjs%2FMikeMcl%2Fbig.js%2Fbig.min.js%0A%0Avar%20max%20%3D%20new%20Big(%20Number.MAX_VALUE%20)%3B%0Amax.toFixed()%3B

person ngduc    schedule 15.03.2015

Фактическая реализация чисел с плавающей запятой IEEE немного (немного!!!) сбивает с толку.

Я считаю, что это помогает, если вы думаете о более простой форме, она реагирует одинаково везде, кроме переполнения и недополнения, где формат IEEE просто лучше.

Это форма:

Число с плавающей запятой состоит из:

  1. Знак числа (+/-)
  2. Целочисленное значение без знака, называемое «мантисса» — сделайте это «v»
  3. Целочисленное значение без знака, называемое «показатель степени» — сделайте это «n»
  4. «Знак» для экспоненты.

Знак числа прост - перед ним стоит минус.
Значение рассчитывается как:

v*2ⁿ 

Если знак экспоненты положительный, то экспонента в основном равна 2*2*2*...*2 для указанного вами количества двоек. Если большое число представлено в десятичном виде, оно будет иметь много цифр вплоть до десятичной точки, НО они бессмысленны. Если вы отобразите число в двоичном формате примерно после 53 двоичных цифр, все остальные будут нулями, и вы не сможете их изменить.

Обратите внимание, что с положительной экспонентой все это целые числа, числа с плавающей запятой (включая числа IEEE) будут вычисляться точно с целыми числами, если вы не переполняетесь. Когда вы переполняете, они все еще ведут себя хорошо, у них просто нули в младших битах.

Только когда показатель степени отрицательный, у вас есть странность

v/(2ⁿ) 

Значение, которое вы получаете для отрицательного показателя степени, по-прежнему основано на значении 2*2*2*...*2, но вместо этого вы делите его. Итак, вы пытаетесь представить, скажем, десятую часть суммой половинок, четвертей, восьмых и так далее... но это не работает точно, поэтому вы получаете ошибки округления и все прекрасные проблемы с плавающей запятой.

Ваше примерное значение:

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

В двоичном виде это

1111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

В конце много нулей.

Что должен знать каждый программист о плавающей запятой

person user3710044    schedule 15.03.2015