SyntaxError: идентификатор начинается сразу после числового литерала при попытке создать BigInt в javascript - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь разрешить число Пи до n цифр в JavaScript по следующей формуле:

#!/usr/bin/env js60

function calculatePi(n) {
    var q = t = k = 1
    var m = x = 3
    var n = n + 1
    var r = 0
    str = ''

    while (str.length < n) {
        if (4 * q + r - t < m * t) {
            str += m

            var rr = r
            r = 10 * (r - m * t)
            m = Math.floor((10 * (3 * q + rr)) / t - 10 * m)
            q = 10 * q
        }

        else {
            m = Math.floor(((q * (7 * k + 2)) + (r * x)) / (t * x))
            r = ((2 * q) + r) * x
            t = t * x
            q = q * k
            k = k + 1
            x = x + 2
        }
    }

    return str.slice(0, 1) + '.' + str.slice(1)
}

print(calculatePi(19))

Вот как это работает на языке с поддержкой целочисленных значений произвольной длины.

Но в JavaScript код генерирует правильные значения до 18 десятичных знаков, и после этого число становится действительно большим для работы. Хуже того, если функции присвоено большое число, например, 10000, она будет выполняться в бесконечном цикле.

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

var a = 1000000000000000000000000000n

Я получаю:

typein:1:8 SyntaxError: identifier starts immediately after numeric literal:
typein:1:8 var a = 1000000000000000000000000000n
typein:1:8 ........^

Как представить целое число произвольной длины в JavaScript?

1 Ответ

0 голосов
/ 09 ноября 2019

Благодаря комментариям, изменение движка JS с SpiderMonkey на Node решило проблему. Окончательный код выглядел следующим образом:

#!/usr/bin/env node

function calculatePi(n) {
    var one = 1n, two = 2n, three = 3n, seven = 7n, ten = 10n
    var q = t = k = one
    var m = x = three
    var n = BigInt(n) + one
    var r = 0n
    str = ''

    while (str.length < n) {
        if (4n * q + r - t < m * t) {
            str += m

            var rr = r
            r = ten * (r - m * t)
            m = (ten * (three * q + rr)) / t - ten * m
            q *= ten
        }

        else {
            t *= x
            m = (q * (seven * k + two) + (r * x)) / t
            r = ((two * q) + r) * x
            q *= k
            k += one
            x += two
        }
    }
    return str.slice(0, 1) + '.' + str.slice(1)
}

console.log(calculatePi(5000))

Теперь он может решать любые цифры, используя память какой-либо системы (около 40 МБ на 5000 цифр).

Код удалил функцию Math.floor (), посколькуBigInt вычисления являются целыми числами. Число с плавающей запятой с произвольной точностью вычисляться здесь не будет.

...