bc는 dc와 어떻게 다릅니 까?


27

계산기 dc와 의 차이점은 무엇입니까 bc?

언제 사용해야 dc언제 bc?


나는 expr명령 줄과 스크립트에서 간단한 계산을 위해 매우 자주 사용 합니다.
MattBianco

답변:


34

dc매우 오래된 도구이며보다 약간 오래된 도구 bc입니다. Wikipedia 페이지 를 인용하려면 :

C 프로그래밍 언어의 발명을 앞두고 가장 오래된 유닉스 유틸리티 중 하나입니다. 그 빈티지의 다른 유틸리티와 마찬가지로 강력한 기능 세트가 있지만 매우 간결한 구문이 있습니다.

구문은 역 광택 표기법으로, 기본적으로 인수 (예 : 숫자)가 연산자 뒤에옵니다. dc사용법 의 기본 예 는 다음과 같습니다.

echo '3 4 * p' | dc

어디는 p계산 결과를 인쇄하는 데 필요합니다. bc반면에 친숙한 접두사 표기법을 사용하므로보다 직관적입니다. bc사용 예는 다음과 같습니다 .

echo '3 * 4' | bc

어느 것을 사용해야합니까?

bcPOSIX에 의해 표준화되어 있으므로 아마도 둘 중 더 이식성이 좋을 것입니다 (적어도 최신 시스템에서는). 수동 계산기 작업을하는 경우 확실히 선택입니다 (당신이 다소 마조히스트가 아닌 한). dc역 광택 표기법이 유용한 경우가 있습니다. 총계로 만들려는 일련의 숫자를 출력하는 프로그램이 있다고 상상해보십시오.

23
7
90
74
29

스트림에 dca 만 추가하면되므로 다음과 같이하는 것이 매우 간단합니다 (적어도 각 연산자가 두 개 이상의 숫자를 사용할 수있는 최신 구현에서는) +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에는 여전히 표기법 echo '3 * 4'로 컴파일 할 수 있는 -c플래그 가 있습니다. | bc`는 입니다. 참고 항목 linux.die.net/man/1/bcfreebsd.org/cgi/man.cgi?query=bc&sektion=1bcdc. For example echo '3 * 4' | bc -c | dc
라파엘 렌스

14
흠, dc당신은 무엇을 사용하고 있습니까? Ubuntu 14.04 및 OS X에서 +작업자는 항상 스택에서 정확히 두 값을 처리합니다.
Digital Trauma

2
올바른 dc사용법 예 : gen_nums_nonnegative | dc -e '0 0 [+?z1<m]dsmxp'. 이 스크립트 dc는 루프에서 하나씩 숫자 를 읽고 추가 한 다음 결과를 인쇄합니다. 음수에 대한 참고 사항을 참조하십시오 .
ruvim

1
@RaphaelAhrens 흥미롭고, macOS bc -c에서는 이상하고 다른 것을합니다 (그리고 -c플래그는 문서화되지 않았습니다 ). 에 파이핑하려고 dc하면 많은 오류가 발생합니다 (파이핑하지 않은 출력 dc은 매우 암호입니다 @iK3:K4:*W@r\n@i).
Konrad Rudolph

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의 프론트 엔드로 작성되었습니다"
Adam

3

dc계산기이지만 bc실제 언어입니다. 해당 매뉴얼 페이지를 참조하십시오.

dc

dc는 무제한 정밀 산술을 지원하는 리버스 폴리쉬 데스크 계산기입니다. 또한 매크로를 정의하고 호출 할 수 있습니다. 일반적으로 dc는 표준 입력에서 읽습니다. 명령 인수가 제공되면 파일 이름이며 dc는 표준 입력에서 읽기 전에 파일의 내용을 읽고 실행합니다. 모든 일반 출력은 표준 출력입니다. 모든 오류 출력은 표준 오류입니다.

기원전

bc는 문장의 대화식 실행으로 임의의 정밀도 숫자를 지원하는 언어입니다. 구문은 C 프로그래밍 언어와 유사합니다. 표준 수학 라이브러리는 명령 행 옵션으로 제공됩니다. 요청 된 경우 수학 라이브러리는 파일을 처리하기 전에 정의됩니다. bc는 명령 행에 나열된 모든 파일의 코드를 나열된 순서대로 처리하여 시작합니다. 모든 파일이 처리 된 후 bc는 표준 입력에서 읽습니다. 모든 코드는 읽을 때 실행됩니다. 파일에 프로세서를 중지하는 명령이 포함되어 있으면 bc는 표준 입력에서 읽지 않습니다.

그것은 당신이 궁극적으로 수학적으로하고 싶은 것에 달려 있습니다. 을 사용하여 일부 작업을 수행 할 수 없습니다 dc. 몇 가지 다른 명령 줄 계산기 도구 외에도 몇 년 동안 사용했습니다. 몇 가지 추가 예제는 " 명령 행 표현식 솔버? "를 참조하십시오 .


3
@REACHUS-나는 당신이 무엇을 요구하는지 이해하지 못합니까? 으로 인해 dc난 항상 HP에게 역 폴란드 표기법 계산기를 사용했습니다 역 폴란드어 표기법 계산기되고 이후 실제로 사용하는 것을 선호 dcbc하지만 그들은 당신이 복잡한 수학적 계산을 수행 할 필요가 둘 다 아직 사용 언제있어 말할 것입니다. 나는 종종 그것들을 사용하여 숫자 10 / b 10을 16 및 2로 변환합니다.
slm

3
bc했다 언어 가 만들어 있다는 점에서 dc더 강력하지 않는 것이 - 인간 친화적 인. 요즘은 애플 리케이션 libs와 공유하지만 bc불리는 한 언어계산기를 하기 때문에 수학을했고, 수학 이야기 -에 . 다음은 오래된 페이지입니다 . [1] 이라는 언어 가 개발되어 고급 언어로 작성된 프로그램을 받아들이고 DC에서 해석되는 출력을 컴파일합니다. 아래 설명 된 명령 중 일부는 컴파일러 인터페이스 용으로 설계되었으며 사람이 조작하기 쉽지 않습니다. dcdcbcdcmanBC
mikeserv

2
나는 dc또한 언어 라고 주장한다 . 예 : codegolf.stackexchange.com/a/47921/11259
Digital Trauma

1
@DigitalTrauma 렉서와 파서가 있기 때문에 언어가 터무니없는 것이 아니라고 주장합니다. 그러나 그 예를 들어 인간이 읽을 수 있다고 주장하는 것은 터무니없는 것입니다. 내 말은 ... 젠장
Parthian Shot

1
@ParthianShot 합의. "dc는 계산기 인 반면에 bc는 실제 언어 입니다 "라는 필자가 읽은 것은 slm이 dc가 내가 동의하지 않는 언어가 아니라는 것을 암시한다는 것입니다. 그러나 나는 단지 틀린 답을 읽고 있을지도 모른다 ...
Digital Trauma

0

나의 겸손한 의견과 가능한 한 적은 단어로 GNU dc는 세 가지면에서 GNU bc와 다릅니다.

1) bc의 수학 라이브러리가 걱정스럽지 않은 경우, 기초 산술을 할 때 가능한 한 많은 키 입력 (1 월 Łukasiewicz의 말 : 괄호가없는 표기법)을 저장하여 필수 사항에 집중하고 산만하지 않도록하십시오.

2) Microsoft Windows 7의 명령 행에서 GNU dc는 GNU bc보다 적은 메모리 (~ 320K)를 소비합니다 (~ 360K).

3) GNU bc보다 GNU dc에서 세분화 된 제어, 예를 들어 스택 및 레지스터 명령은 GNU bc에 없습니다.

둘 다에 대한 버전 1.07.1 win32는 https://embedeo.org/ws/command_line/bc_dc_calculator_windows/에 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.