Как стать автором
Обновить

Комментарии 40

Бенчмарк на i7-5775c, линукс в виртуалбоксе на винде.

real 0m19.454s
user 0m19.420s
sys 0m0.000s

Антиоффтопик:
То есть, bc позволяет оперировать только от 2 до 16-ричной системы?
А есть простой способ переводить в произвольную систему, без программирования?
i5-4460 CPU @ 3.20GHz, ESXi 6, тест в двух виртуалках — Linux и FreeBSD
Примерно двукратная разница, результат расчета одинаков.
Наверное разные реализации bс, не думаю что от ОС так зависит.

Debian 8.2:

real 0m17.874s
user 0m17.796s
sys 0m0.000s

FreeBSD 10.3-RELEASE:

9.600u 0.047s 0:09.67 99.6% 40+167k 0+0io 0pf+0w
i7-4700, встроенный в Win10 Bash
real 0m15.492s
user 0m15.438s
sys 0m0.016s
Скорее всего, данный код однопоточный.
Запустите несколько потоков.
А есть простой способ переводить в произвольную систему, без программирования?
Есть. Делим с остатком на основание системы. Остаток записываем справа. С результатом повторяем операцию, пока число не кончится.

19 в двоичной
19/2=9, остаток 1
9/2=4, остаток 1
4/2 = 2, остаток 0
2/2 =1, остаток 0
1/2 = 0, остаток 1
записываем это всё справа-налево — 10011

19 в пятиричной
19/5 = 3, остаток 4
3/5 = 0, остаток 3
записываем справа-налево — 34

19 в 19-ричной
19/19 = 1, остаток 0
1/19 = 0, остаток 1
записываем справа-налево — 10

19 в любой системе с основанием больше 19
19/Основание = 0, остаток 19
считаем 19 буквами, (помним, что F — 15) получаем J
Это не совсем простой, я думал что-то типа
echo «base=10; 12312313» | bc
Но без ограничений.
А тут все равно придется писать.
а, я протупил. я решил, что вы спрашиваете, как вручную переводить в любую систему :)
https://www.tools4noobs.com/online_tools/base_convert/

Zsh позволяет использовать любую систему счисления с целочисленными основаниями от 2 до 36:


% echo $(( [#36] 15#1078ABE ))
36#70D7H

Специально для 16‐ричной системы работает префикс 0x, для двоичной — 0b, других специальных префиксов нет (для 8‐ричной можно включить обычный 0755 == 493, но по‐умолчанию это отключено). Zsh также работает и с числами с плавающей точкой (но только в десятичной записи). Но zsh работает только с 64‐битными целыми и double, никакой длинной арифметики или чисел произвольной точности. Можно попросить zsh отделять каждые n разрядов, по‐умолчанию 3:


% echo $(( [#_] 107825.17632 ))
107_825.176_32
% echo $(( [#_4] 107825.17632 ))
10_7825.1763_2
НЛО прилетело и опубликовало эту надпись здесь

В программе забит приоритет и ассоциативность операторов, что превращает 4^4^4 в 4^(4^4). Такое вполне правильно считать «группировкой».

НЛО прилетело и опубликовало эту надпись здесь

Во всех случаях программа «сама решает» в соответствии с заложенными в неё правилами. Я отвечал на ваше «ничего не группирует» — ассоциативность операторов определяет группировку и говорить так не менее некорректно.

Из консоли считаю в node, просто запускаю и пишу выражение.
В gnome3 при установленном калькуляторе, можно считать прямо в строке поиска приложений.

И в KDE тоже.
В Плазме или 4-й версии?
В 4-й точно считает, в строке которая по Alt+F2 вызывается. Очень удобно, не знал до этого и всегда в консоли считал :)
Во время чтения интернета для этой цели удобно использовать F12.
ipython в этом плане, наверное, лучше)
НЛО прилетело и опубликовало эту надпись здесь
>$ expr 15+25

Пробелы пропущены, должно быть

$ expr 15 + 25
Вы правы, сейчас исправлю.

$ expr 15+25
$ 15+25
echo 'ibase=2;obase=10;10' | bc
10

Из общих соображений кажется естественным вначале задавать obase в привычной системе, потом ibase. Я так попробовал, и оно работает ожидаемым образом:


echo 'obase=10;ibase=2;10' | bc
2

Класс!
$ echo 'ibase=2;obase=10;10' | bc
$ 10
$ echo 'obase=10;ibase=2;10' | bc
$ 2

Развращенный идеей функциональной чистоты, которая из первобытных функциональных языков проникла в почти во все современные, народ уже начал было забывать ужасы императивщины и потерял страх перед побочными эффектами.


ibase=2;obase=10;

— здесь мне тоже хочется увидеть такой смысл:


(ibase,obase)=(2,10)

но в тех присваиваниях притаился побочный эффект.

Для этого не нужно устанавливать дополнительных программ, все уже есть в базовом наборе операционной системы.

В Arch по умолчанию нет bc.

НЛО прилетело и опубликовало эту надпись здесь
Да и в Debian тоже.
Еще существует консольный калькулятор apcalc.
Единственное, что в bc раздражает, — это скудность математической библиотеки. Например, возведение в дробную степень отсутствует:
$ echo '2^1.5' | bc -l
Runtime warning (func=(main), adr=9): non-zero scale in exponent
2

Приходится извращаться с помощью экспоненты и логарифма, что не очень удобно:
$ echo 'e(l(2)*1.5)' | bc -l
2.82842712474619009755

Или какой-нибудь арккосинус если нужно посчитать, приходится использовать арктангенс.
Виндовый CMD (а если точнее batch) тоже немного могёт в расчёты. Имеются: сложение, вычитание, умножение и деление (целочисленное, остаток подавляется). Например:
set /a result=15+25
echo %result%
Стоит отметить, если не в скриптах пилить, то результат выдаст и первая строчка. Кроме того, учитывая тот факт, что приличная часть народу на линуксах использует wine, то сей метод хоть и бессмыслен, но всё же имеет место быть.
про bc рассказывается в книге «UNIX and Linux System Administration Handbook, 4th Edition» в вводной про сети. там же — про ipcalc, для расчета сетевых адресов и масок подсетей.
про GHCi выше уже сказали, познакомился, когда пытался в haskell
насчет таблиц и графиков, пользуем SigmaPlot
Использую calc (пакет в Ubuntu — apcalc, в Arch — calc). В отличии от bc имеет более очевидный синтаксис и терпим к нему (не нужно следить за пробелами между частами выражения, «25+ 4 -6» = 23), фактически может использоваться как скриптовой язык (!) через #!/usr/bin/calc. Жаль, его нет в дефолтной поставке.
А в раздел «математические среды», возможно, стоит добавить RStudio.
В PowerShell арифметика в естественном виде доступна сразу. Я очень рад, что он портирован под Linux, очень удобно.
Сам все еще часто пользуюсь bc или ghci (когда надо что-то нетривиальное со строками или списками посчитать), реже awk, если попалась какая-то таблица, а дочку пытаюсь приучить к R (она сопротивляется и пользуется обычным микрокалькулятором, даже не программируемым).
Пример с потерей числа интересный, спасибо.
Понадобилось какое-то время, чтобы понять, о чём речь и что к чему, особенно если пропустить ссылку на «источник» :)
real 0m50.958s
user 0m50.952s
sys 0m0.000s

model name: Intel® Pentium® 4 CPU 2.80GHz
cpu MHz: 2798.580
cache size: 1024 KB
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории