Jump to content

bc (programming language)

This is a fully translated article. Click here for more information.
From DawoumWiki, the free Mathematics self-learning

bc
Developer(s)Robert Morris and Lorinda Cherry of Bell Labs, Philip A. Nelson
Initial release1975, 48–49 years ago
Operating systemUnix, Unix-like, Plan 9, FreeDOS
PlatformCross-platform
TypeCommand

bc (basic calculator에 대한 줄임말, 종종 bench calculator로 참조됨)는 C 프로그래밍 언어와 유사한 구문을 가진 "임의 정밀도 계산기 언어"입니다. bc는 전형적으로 수학적 스크립팅 언어 또는 대화형 수학적 쉘로 사용됩니다.

Overview

전형적인 대화식 사용법은 유닉스 명령 프롬프트bc 명령을 입력하고 (1 + 3) * 2와 같은 수학 표현식을 입력하면 8이 출력될 것입니다. bc는 임의의 정밀도로 작동할 수 있지만, 그것은 실제로 기본적으로 십진 점 뒤에 자릿수는 영이므로, 표현식 2/30을 산출합니다. 이것은 이 사실을 모르는 새로운 bc 사용자를 놀라게 할 수 있습니다. bc에 대한 -l 옵션은 기본 스케일 (십진 점 뒤의 자릿수)을 20으로 설정하고 언어에 몇 가지 추가 수학 함수를 더합니다.

History

bc는 1975년 버전 6 유닉스에 처음 등장했었고 Bell LabsRobert MorrisLorinda Cherry에 의해 작성되었습니다. bc 앞에는 같은 저자가 작성한 초기 임의 정밀도 계산기, dc가 있었습니다. dc는 임의의-정밀도 계산을 수행할 수 있지만, 대수 공식을 평가하는 데 많은 사랑을 받는 역 폴란드 표기법 (RPN) 구문은 흐름 제어를 표현할 때 사용자에게 불편함을 입증했기 때문에 bcdc의 프런트-엔드로 작성되었습니다. bc는 새로운, C와 유사한, bc 구문을 dc접미사 표기법으로 변환하고 dc를 통해 결과를 파이프하는 매우 간단한 컴파일러 (수백 줄이 포함된 단일 yacc 소스 파일)였습니다.

1991년에, POSIXbc를 엄격하게 정의하고 표준화했습니다. 이 표준의 세 가지 구현이 오늘날까지 남아 있습니다: 첫 번째는 유닉스와 Plan 9 시스템에서 살아남은 dc의 프론트-엔드, 전통적인 유닉스 구현입니다. 두 번째는 Philip A. Nelson에 의해 1991년에 처음 출시된 자유 소프트웨어 GNU bc입니다. GNU 구현은 POSIX 표준을 넘어서는 수많은 확장을 가지고 더 이상 dc의 프론트엔드가 아닙니다 (그것은 바이트코드 인터프리터입니다). 세 번째는 2003년 OpenBSD에서 재구현한 것입니다.

Implementations

POSIX bc

POSIX 표준화된 bc 언어는 전통적으로 dc의 퉁명스러운 구문의 복잡성없이 dc 언어의 기능에 더 높은 수준의 접근을 제공하기 위해 dc 프로그래밍 언어에서 프로그램으로 작성됩니다.

이 형식에서, bc 언어는 단일-문자 변수, 배열함수 이름과 대부분의 표준 산술 연산자뿐만 아니라 C로부터 친숙한 제어-흐름 구조 (if(cond)..., while(cond)...for(init;cond;inc)...)를 포함합니다. C와 달리, if 절 뒤에 else가 올 수 없습니다.

함수는 define 키워드를 사용하여 정의되고, 괄호 안에 반환 값이 뒤따르는 return을 사용하여 값이 반환됩니다. auto 키워드 (C에서는 선택적)는 변수를 함수에 대한 로컬로 선언하기 위해 사용됩니다.

모든 숫자와 변수 내용은 정밀도 (십진 자리에서)가 전역 scale 변수에 의해 결정되는 임의-정밀도 숫자입니다.

입력 (대화식 모드에서), 출력 및 프로그램 상수의 수치적 밑수는 예약된 ibase (입력 밑수) 및 obase (출력 밑수) 변수를 설정함으로써 지정될 수 있습니다.

출력은 계산 결과를 변수에 의도적으로 할당하지 않음으로써 생성됩니다.

주석은 C /**/ (주석 시작 및 끝) 기호의 사용에 의해 bc 코드에 추가될 수 있습니다.

Mathematical operators

Exactly as C

다음 POSIX bc 연산자는 C 짝처럼 똑같이 동작합니다:

+     -     *     /
+=    -=    *=    /=
++    --    <     >
==    !=    <=    >=
( )   [ ]   { }
Similar to C

모듈러스 연산자, %%=는 오직 전역 scale 변수가 0으로 설정되어 있을 때, 즉, 모든 계산이 정수-전용일 때 C 짝과 똑같이 작동합니다. 그렇지 않으면 계산은 적절한 스케일로 수행됩니다. a%ba-(a/b)*b로 정의됩니다. 예제:

$ bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
scale=0; 5%3
2
scale=1; 5%3
.2
scale=20; 5%3
.00000000000000000002
Conflicting with C

다음 연산자는

^     ^=

표면적으로는 C 비트별 배타적-논리합(exclusive-or) 연산자와 유사하지만, 실제로는 bc 정수 지수 연산자입니다.

특히 음수와 함께 ^ 연산자의 사용은 C 연산자 우선 순위를 따르지 않음을 주목하십시오. -2^2는 −4가 아닌 bc에서 4의 답을 제공합니다.

"Missing" operators relative to C

비트별, 부울조건부 연산자:

&     |     ^     &&    ||
&=    |=    ^=    &&=   ||=
<<    >>
<<=   >>=
?:

이것들은 POSIX bc에서 사용할 수 없습니다.

Built-in functions

제곱근 계산을 위한 sqrt() 함수는 POSIX bc의 유일한 내장 수학 함수입니다. 다른 함수는 외부 표준 라이브러리에서 사용할 수 있습니다.

인수의 정밀도 (scale 변수와 같이)를 결정하기 위한 scale() 함수와 인수에서 유효 십진 자릿수의 개수를 결정하기 위한 length() 함수도 내장되어 있습니다.

Standard library functions

bc의 표준 수학 라이브러리 (-l 옵션으로 정의됨)에는 사인, 코사인, 아크탄젠트, 자연 로그, 지수 함수 및 두 개의 매개변수 베셀 함수 J를 계산하기 위한 함수를 포함하고 있습니다. 대부분의 표준 수학 함수 (다른 역삼각 함수 포함)는 이것들을 이용하여 구축될 수 있습니다. 다른 많은 함수의 구현에 대해서는 외부 링크를 참조하십시오.

bc 표준 라이브러리[1]
bc 명령 함수 설명
s(x) 사인 라디안에서 각도 x를 취합니다
c(x) 코사인 라디안에서 각도 x를 취합니다
a(x) 아크탄젠트 라이안을 반환합니다
l(x) 자연 로그
e(x) 지수 함수
j(n,x) 베셀 함수 x의 차수-n 베셀 함수를 반환합니다

-l 옵션은 스케일을 20으로 변경하므로,[1] 모듈로와 같은 것이 예기치 않게 작동할 수 있습니다. 예를 들어, bc -l을 쓰고 그런-다음 print 3%2 명령은 0을 출력합니다. 그러나 bc -l 다음에 scale=0을 쓰고 그런-다음 print 3%2 명령은 1을 출력할 것입니다.

Plan 9 bc

Plan 9 bc는 POSIX bc와 동일하지만 추가적인 print 명령문이 있습니다.

GNU bc

GNU bc는 POSIX 표준에서 파생되었고 많은 개선 사항을 포함합니다. 그것은 POSIX 표준의 dc 기반 구현과 완전히 별개이고 대신 C로 작성되었습니다. 그럼에도 불구하고, 그것은 모든 POSIX bc 프로그램이 수정되지 않은 GNU bc 프로그램으로 실행되기 때문에 완전히 역호환됩니다.

GNU bc 변수, 배열 및 함수 이름은 둘 이상의 문자를 포함할 수 있고, 일부 추가 연산자가 C에서 포함되었고, 특히 if 절 다음에 else가 올 수 있습니다.

출력은 의도적으로 계산 결과를 변수에 할당하지 않거나 (POSIX 방식) 추가된 print 문을 사용함으로써 달성됩니다.

게다가, read 문은 실행 중인 계산에 숫자를 대화형으로 입력하는 것을 허용합니다.

C-스타일 주석 외에도, # 문자는 다음 줄 바꿈이 될 때까지 그 뒤에 오는 모든 것을 무시할 것입니다.

마지막 계산의 값은 항상 추가적인 내장된 last 변수 내에 저장됩니다.

Extra operators

다음 논리 연산자는 POSIX bc의 논리 연산자에 추가됩니다:

&&     ||      !

그것들은 조건문 (예를 들어, if 문 내)에서 사용할 수 있습니다. 어쨌든, 여전히 동등한 비트별 또는 할당 연산이 없다는 점에 유의하십시오.

Functions

GNU bc에서 사용 가능한 모든 함수는 POSIX에서 상속됩니다. GNU 배포판에서는 더 이상의 함수가 표준으로 제공되지 않습니다.

Example code

bc ^ 연산자는 오직 오른쪽에 정수 거듭제곱을 허용하기 때문에, bc 사용자가 작성할 수 있는 첫 번째 함수 중 하나는 부동-점 지수를 갖는 거듭제곱 함수입니다. 아래 두 가지 모두 표준 라이브러리가 포함되어 있다고 가정합니다:

A "power" function in POSIX bc

 /* A function to return the integer part of x */
 define i(x) {
    auto s
    s = scale
    scale = 0
    x /= 1   /* round x down */
    scale = s
    return (x)
 }

 /* Use the fact that x^y == e^(y*log(x)) */
 define p(x,y) {
    if (y == i(y)) {
       return (x ^ y)
    }
    return ( e( y * l(x) ) )
 }

Calculating π to 10000 digits

내장 아크탄젠트 함수 a()를 사용하여 파이를 계산합니다:

$ bc -lq
scale=10000
4*a(1) # The atan of 1 is 45 degrees, which is pi/4 in radians.
       # This may take several minutes to calculate.

A translated C function

bc의 구문은 C의 구문과 유사하기 때문에, C로 작성된 공개된 수치 함수는 종종 bc의 임의의 정밀도를 즉시 제공하는 bc로 매우 쉽게 변환될 수 있습니다. 예를 들어, Journal of Statistical Software (2004년 7월, 11권, 5호)에서 George Marsaglia누적 정규 분포에 대해 다음 C 코드를 게시했습니다.

double Phi(double x)
{
    long double s=x,t=0,b=x,q=x*x,i=1;
    while(s!=t)
        s=(t=s)+(b*=q/(i+=2));
    return .5+s*exp(-.5*q-.91893853320467274178L);
}

bc의 다른 구문을 수용하기 위해 필요한 몇 가지 변경 사항과 상수 "0.9189..."가 실제로 log(2*PI)/2임을 인식하면, 이것은 다음 GNU bc 코드로 변환될 수 있습니다:

define phi(x) {
    auto s,t,b,q,i,const
    s=x; t=0; b=x; q=x*x; i=1
    while(s!=t)
        s=(t=s)+(b*=q/(i+=2))
    const=0.5*l(8*a(1))   # 0.91893...
    return .5+s*e(-.5*q-const)
}

Using bc in shell scripts

bc파이프를 통한 입력과 함께 비대화식으로 사용될 수 있습니다. 이것은 쉘 스크립트 내에서 유용합니다. 예를 들어:

$ result=$(echo "scale=2; 5 * 7 /3;" | bc)
$ echo $result
11.66

대조적으로, 배시 쉘은 오직 정수 산술을 수행합니다. 예를 들어:

$ result=$((5 * 7 /3))
$ echo $result
11

우리는 here-string 관용구 (bash, ksh, csh에서)를 사용할 수도 있습니다:

$ bc -l <<< "5*7/3"
11.66666666666666666666

See also

References

  1. ^ a b Nelson, Philip A. (20 March 2001). "bc Command Manual". Free Software Foundation. Retrieved 2017-04-20.

External links