Вычислить 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 тут значительно проигрывает.
Отладка JavaScript в nodejs
Node.js умеет из коробки отлаживать JavaScript файлы. Для того чтобы зайти в режим отладки нужно запустить скрипт с коммандой inspect.
node inspect <filename.js>
При этом программа начнёт выполняться сразу в режиме отладки и остановится на первой строке.
Для перехода к следующей строке нажмите n[enter], для step into s[enter], для продолжения (Resume execution) с[enter].
Выход из приложения два раза ^C.
Записал коротенькое видео как это делается.
Atom - IDE
В очередной раз решил попробовать Атом. Оказалось, что с того времени, как я его ставил последний раз технологии продвинулись вперед, и теперь им вполне можно пользоваться. Конечно это не phpStorm, но за свои деньги (а он, кстати, бесплатный) он оказался вполне сравнимым по возможностям.
Главным критерием для меня было, чтобы можно было в одной среде работать с Java, С++ и PHP. Atom пока вполне с этой задачей справляется, конечно, не так хорошо как специализированные продукты, но, это от него и не требуется.
Из нужных расширений пока поставил goto-definition и terminal-tab. Сильно не хватает продвинутых возможностей статического анализа от phpStorm ну да без этого пока можно жить.
Разработка под Андроид
Иногда резко возникает желание что-нибудь запилить под Android. Не то, чтобы я не любил разработку под Андроид. Нет, наоборот, мне это нравится, но, если это не то, чем ты занимаешься каждый день, а, скажем, запускаешь среду время от времени, то разработка превращается в скачивание время от времени гигабайт всякой фигни без всякого выхлопа.
Переехав на новый SSD встала необходимость доставить инструменты для разработки.
1. Установил Android Studio, которая сама по себе весит один гигабайт. Ну, ок, открываю проект. Оказывается, мой проект устарел - конвертируем в новый формат. Ок.
2. Не хватает gradle - скачиваем
3. Не хватает Android Platform 8 - скачиваем
4. Не хватает Build Tools - скачиваем
5. Компилируем еще раз, пока компилируется предлагают обновить gradle на новую версию - спасибо, не надо, мне бы поработать... Прошлый раз я сказал уже yes - пришлось час гуглить как починить проект для работы с новом gradle.
6. Для запуска давай, создавай виртуальный девайс - Скачиваем образ системы для виртуального девайса.
7. Теперь не хватает доступа к /dev/kvm - гуглим, чиним
Вуаля, виртуальный девайс заработал! Но хочется же и на физическом устройсте запустить. Тут запустилось почти сразу, правда пришлось еще скачать Android Platform 9 - для быстрой компиляции - ибо на устройстве стоит именно эта версия.
Ура! Можно программировать, управился с настройкой окружения за два дня!Программировать уже расхотелось, пойду посплю. В следуюущий раз, когда возникнет желание попрограммировать, история повторится.