Чим bc відрізняється від постійного струму?


27

Які відмінності між dcі bcкалькуляторами?

Коли я повинен використовувати dcі коли bc?


Я використовую exprдуже часто для простих обчислень в командному рядку та в скриптах.
MattBianco

Відповіді:


34

dcє дуже архаїчним інструментом і дещо старшим за bc. Щоб цитувати сторінку Вікіпедії :

Це одна з найдавніших утиліт Unix, яка передбачає навіть винахід мови програмування C; як і інші утиліти цього урожаю, він має потужний набір функцій, але надзвичайно короткий синтаксис.

Синтаксис - це зворотна польська позначення, яка в основному означає, що аргументи (тобто числа) спочатку йдуть за оператором. Основний приклад dcвикористання:

echo '3 4 * p' | dc

Там, де pпотрібно надрукувати результат обчислення. bcз іншого боку, використовує більш звичні позначення інфіксів і, таким чином, є більш інтуїтивно зрозумілим. Ось приклад bcвикористання:

echo '3 * 4' | bc

Який використовувати?

bcє стандартизованим POSIX і тому, ймовірно, більш портативний з цих двох (принаймні, в сучасних системах). Якщо ви займаєтесь ручною роботою калькулятора, то це, безумовно, вибір (якщо ви дещо не мазохіст). dcПроте, як і раніше, це може бути використане, ось випадок, коли зворотна польська нотація стане в нагоді. Уявіть, що у вас є програма, яка виводить потік чисел, які ви хочете підсумовувати, наприклад:

23
7
90
74
29

Зробити це dcдуже просто (принаймні, із сучасними реалізаціями, де кожен оператор може взяти більше двох чисел), оскільки вам потрібно лише додати a +pдо потоку, наприклад:

{ gen_nums; echo +p } | dc

Але bcце складніше, оскільки нам потрібно не тільки поставити + між кожним числом і переконатися, що все знаходиться в одному рядку, але і переконатися, що в кінці є новий рядок:

{ gen_nums | sed '$ !s/$/+/' | tr -d '\n'; echo; } | bc

10
Ви перетворили gen_numsприклад жахливо складним шляхом bc. Це може бути спрощено до:gen_nums | paste -sd+ | bc
devnull

14
Факт забави: Традиційно це bcбув лише інструмент на передньому кінці, який складав bcпозначення до позначень dcта додавав їх dcдо результату. На FreeBSD все ще є -cпрапор, для bcякого ви все ще можете скласти до dcпозначення . For example відлуння '3 * 4' | bc` дорівнює echo '3 * 4' | bc -c | dc. Дивіться linux.die.net/man/1/bc та freebsd.org/cgi/man.cgi?query=bc&sektion=1
Рафаель Аренс

14
Хм, що dcти використовуєш? У Ubuntu 14.04 та OS X +оператор завжди працює на рівно двох значеннях у стеці
Digital Trauma

2
Правильний приклад dcвикористання: gen_nums_nonnegative | dc -e '0 0 [+?z1<m]dsmxp'. Цей сценарій для dcчитання та додавання чисел по одному в циклі, а потім друкує результат. Див. Примітку щодо від’ємних чисел.
рувим

1
@RaphaelAhrens Цікаво, що на macOS bc -cробиться щось дивне та інше (а -cпрапор недокументований). Якщо я спробую передати це dc, я отримаю купу помилок (і результат без втручання в нього dcє самим виразним @iK3:K4:*W@r\n@i).
Конрад Рудольф

9

Основна різниця між ними полягає в тому, що dcвикористовується зворотна польська позначення . Він вимагає явних команд навіть для отримання результату.

Ви можете додати два цілих числа bc, сказавши:

bc <<< "2+4"

і вона виробляла б 6на лінії сама. Однак dcвам потрібно буде сказати:

dc <<< "2 4 +p"

Ви також можете робити дуже цікаві речі, використовуючи dc, наприклад, зверніться до моєї відповіді тут для створення

Hello World!

використовуючи dc.

dc <<< "8 9 * P101P108P108P111P4 8 * P81 6 + P111P114P108P100P33P"


"Bc був написаний як передовий на Dc"
Адам

3

dcє калькулятором, тоді bcяк це фактична мова. Дивіться їхні чоловічі сторінки.

dc

DC - це калькулятор на зворотному шліфуванні, який підтримує арифметику необмеженої точності. Це також дозволяє визначати і викликати макроси. Зазвичай dc зчитує зі стандартного вводу; якщо йому задані будь-які аргументи команд, вони є іменами, а dc зчитує та виконує вміст файлів перед читанням зі стандартного вводу. Весь нормальний вихід відповідає стандартному виходу; вся помилка виводиться на стандартну помилку.

до н.е.

bc - мова, яка підтримує довільні точні числа з інтерактивним виконанням операторів. У синтаксисі з мовою програмування С є деякі подібності. Стандартна математична бібліотека доступна за допомогою параметра командного рядка. За запитом математична бібліотека визначається перед обробкою будь-яких файлів. bc починається з обробки коду з усіх файлів, перелічених у командному рядку, у вказаному порядку. Після обробки всіх файлів, bc зчитується зі стандартного вводу. Весь код виконується під час його читання. (Якщо файл містить команду зупинити процесор, bc ніколи не буде читати зі стандартного вводу.)

Це дійсно залежить від того, що ти в кінцевому рахунку хочеш зробити математично. Деякі операції неможливо використовувати dc. Я використовував обидва роки на додаток до кількох інших інструментів калькулятора командного рядка. Див. " Розв'язувач виразів командного рядка? " Для додаткових прикладів.


3
@REACHUS - Я не впевнений, що я розумію, про що ти питаєш? З - за dcтого , щоб бути зворотної польської нотації калькулятор і так як я завжди використовував HP Reverse Polish Notation калькуляторів я дійсно вважаю за краще використовувати , dcщоб , bcале я б сказав , що вони обидва все ще використовувати в будь-який час вам потрібно виконати складні математичні обчислення. Я часто використовую їх для перетворення чисел b / w бази 10 до бази 16 та бази 2. Але використовував їх для підрахунку стовпців у табличних даних, а також у сценарії AWK.
slm

3
bcбула мова в тому сенсі, що вона робила dcдоброзичливу людину - не те, щоб вона була більш потужною. У ці дні додатки розділяє LIBS, але bcназивали мову і dcз калькулятором , бо dcзробили математику і bcговорили математика - до dc. Ось старіша manсторінка : Розроблена мова під назвою BC[1], яка приймає програми, написані мовами вищого рівня та збирає вихід, інтерпретований DC. Деякі з описаних нижче команд були розроблені для інтерфейсу компілятора і користувачеві людиною нелегко маніпулювати ними.
mikeserv

2
Я стверджую, що dcце також мова. наприклад, codegolf.stackexchange.com/a/47921/11259
Digital Trauma

1
@DigitalTrauma Стверджувати, що це не мова, було б абсурдом, оскільки вона має лексери та аналізатори. Але стверджувати, що це читається по-людськи, враховуючи цей приклад, було б абсурдно. Я маю на увазі ... чорт.
Парфянський розстріл

1
@ParthianShot Погодився. Моє читання "dc - це калькулятор, тоді як bc - це фактична мова" - це те, що slm означає, що dc не є мовою, з якою я не згоден. Але я, можливо, просто читаю відповідь неправильно ...
Digital Trauma

0

На мою скромну думку і якомога менше слів, GNU dc відрізняється від GNU bc трьома способами:

1) Якщо математика бібліотеки bc не викликає занепокоєння, щоб зберегти якомога більше натискань на клавіші (за словами Яна Лукасевича: нотація без дужок), виконуючи елементарну арифметику, сконцентруватися більше на суті та уникнути відволікань.

2) У командному рядку Microsoft Windows 7 GNU dc споживає менше пам'яті (~ 320K), ніж GNU bc (~ 360K).

3) Більш деталізований контроль у GNU dc, ніж у GNU bc, наприклад, команди стека та регістру відсутні у GNU bc.

Версія 1.07.1 win32 для обох - за адресою https://embedeo.org/ws/command_line/bc_dc_calculator_windows/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.