2020-04-20

Вычислить n знаков числа Пи

В Твиттере Раймонда Хеттингера был интересный твит - вычисление n знаков числа Пи - на Питоне.

Стало интересно как записать это на JavaScript. Сказано - сделано:


function pi(places) {
    const extra = 8;

    const pow = function(number, power) {
        result = number;
        for(let i = 0; i < power; i++) {
            result *= number;
        }
        return result;
    }

    const one = pow(BigInt(10), places + extra)
    let t = BigInt(3) * one;
    let c = BigInt(3) * one;
    let n = BigInt(1);
    let na = BigInt(0);
    let d = BigInt(0);
    let da = BigInt(24);
    while (t > 1) {
        n = n + na;
        na = na + BigInt(8);
        d = d + da;
        da = da + BigInt(32);
        t = (t * n / d);
        c += t;
    }
    return (c / pow(BigInt(10), extra))
}

console.log(pi(100)) //3141592653589793238462643383279502884197169399375105820974944592307816406
                     //2862089986280348253421170679

Занятно было посмотреть как работают вычисления в BigInt - если результатом деления двух Int в JavaScript будет Float то результатом деления двух BigInt будет тоже BigInt. При этом нельзя использовать Math.pow для возведения в степень - результатом Math.pow оказывается Number и точность вычислений заметно теряется. Поэтому пришлось делать свою функцию pow c n умножений. Как сделать лучше пока не придумал.

Как мы видим работать с int64 на Питоне значительно проще - Javascript тут значительно проигрывает.

 

комментарии:

 
Maksim Starikov (анонимный пользователь) | 2020-04-21
Полковнику никто не пишет...

Для того чтобы каждый раз не представляться можно войти как зарегистрированный пользователь.

Имя*

разрешены только теги br, font, span, p, strong, u, p, blockquote, a, div, img - остальные будут безжалостно удаляться