pne (język programowania)
Deweloperzy | Robert Morris i Lorinda Cherry z Bell Labs |
---|---|
Pierwsze wydanie | 1975, 47–48 lat temu |
System operacyjny | Unix , uniksopodobny , Plan 9 , FreeDOS |
Platforma | Międzyplatformowe |
Typ | Komenda |
bc , dla podstawowego kalkulatora (często określanego jako kalkulator stołowy ), jest „ językiem kalkulatora o dowolnej precyzji ” ze składnią podobną do języka programowania C. bc jest zwykle używany jako matematyczny język skryptowy lub jako interaktywna powłoka matematyczna.
Przegląd
0 Typowym interaktywnym użyciem jest wpisanie polecenia bc
w wierszu polecenia systemu Unix i wprowadzenie wyrażenia matematycznego, takiego jak (1 + 3) * 2
, po czym zostanie wyświetlone 8 . Chociaż bc może działać z dowolną precyzją, w rzeczywistości domyślnie przyjmuje zero cyfr po przecinku, więc wyrażenie 2/3
daje wyniki (wyniki są obcinane, a nie zaokrąglane). Może to zaskoczyć nowych, nieświadomych tego faktu użytkowników bc. Opcja -l
dla bc ustawia domyślną skalę (cyfry po przecinku) na 20 i dodaje kilka dodatkowych funkcji matematycznych do języka.
Historia
bc pojawił się po raz pierwszy w wersji 6 Unix w 1975 roku. Został napisany przez Lorindę Cherry z Bell Labs jako nakładka na dc , kalkulator o dowolnej precyzji napisany przez Roberta Morrisa i Cherry'ego. dc wykonał obliczenia z dowolną precyzją podane w odwrotnej notacji polskiej . bc dostarczył konwencjonalny interfejs języka programowania do tych samych możliwości za pośrednictwem prostego kompilatora (pojedynczy plik źródłowy yacc zawierający kilkaset wierszy kodu), który przekonwertował składnię podobną do języka C na notację dc i przesyłał wyniki przez dc.
W 1991 roku POSIX rygorystycznie zdefiniował i ustandaryzował bc. Do dziś przetrwały trzy implementacje tego standardu: pierwsza to tradycyjna implementacja Uniksa, nakładka na dc, która przetrwała w systemach Unix i Plan 9 . Drugie to wolne oprogramowanie GNU bc, po raz pierwszy wydane w 1991 roku przez Philipa A. Nelsona. Implementacja GNU ma liczne rozszerzenia wykraczające poza standard POSIX i nie jest już nakładką na dc (jest interpreterem kodu bajtowego ). Trzeci to ponowna implementacja przez OpenBSD w 2003 roku.
Implementacje
POSIX pne
Standardowy język bc POSIX jest tradycyjnie pisany jako program w języku programowania dc , aby zapewnić wyższy poziom dostępu do funkcji języka dc bez złożoności zwięzłej składni dc.
W tej formie język bc zawiera jednoliterowe nazwy zmiennych , tablic i funkcji oraz większość standardowych operatorów arytmetycznych, a także znane konstrukcje sterowania ( if( cond ) …
, while( cond ) …
i for ( init ; cond ; inc ) ...
) z C. W przeciwieństwie do C, po klauzuli if
nie może następować instrukcja else
.
Funkcje są definiowane za pomocą słowa kluczowego define
, a wartości są z nich zwracane za pomocą zwrotu
, po którym następuje wartość zwracana w nawiasach. Słowo auto
(opcjonalne w C) służy do deklarowania zmiennej jako lokalnej dla funkcji.
Wszystkie liczby i zawartość zmiennych są liczbami o dowolnej precyzji , których precyzja (w miejscach dziesiętnych) jest określona przez globalną zmienną skali
.
Podstawę liczbową stałych wejściowych (w trybie interaktywnym), wyjściowych i programowych można określić poprzez ustawienie zarezerwowanych zmiennych ibase
(podstawa wejściowa) i obase
(podstawa wyjściowa).
Dane wyjściowe są generowane przez celowe nieprzypisywanie wyniku obliczenia do zmiennej.
Komentarze można dodawać do kodu bc za pomocą symboli C /*
i */
(początek i koniec komentarza).
Operatory matematyczne
Dokładnie tak jak Cz
Następujące operatory POSIX bc zachowują się dokładnie tak, jak ich odpowiedniki w C:
+ - * / += -= *= /= ++ -- < > == != <= >= ( ) [ ] { }
Podobny do C
Operatory modułowe %
i %= zachowują się dokładnie tak, jak ich odpowiedniki w C tylko wtedy
, gdy globalna zmienna ilościowa
jest ustawiona na 0, tj. wszystkie obliczenia są wyłącznie liczbami całkowitymi. W przeciwnym razie obliczenia są wykonywane z odpowiednią skalą. a%b
jest zdefiniowany jako a-(a/b)*b
. Przykłady:
$ bc bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. To jest darmowe oprogramowanie BEZ ŻADNEJ GWARANCJI. Aby uzyskać szczegółowe informacje, wpisz „gwarancja”. skala=0; 5%3
2 skala=1; 5%3
0,2 skala=20; 5%3
.00000000000000000002
Konflikt z C
Operatorzy
^ ^=
powierzchownie przypominają C bitowe operatory wyłączności lub , ale w rzeczywistości są operatorami potęgowania liczb całkowitych bc.
Warto zauważyć, że użycie operatora ^
z liczbami ujemnymi nie jest zgodne z pierwszeństwem operatora C. -2^2
daje odpowiedź 4 pod bc zamiast -4.
„Brakujące” operatory względem C
Operatory bitowe , logiczne i warunkowe :
& | ^ && || &= |= ^= &&= ||= << >> <<= >>= ?:
nie są dostępne w POSIX bc.
Wbudowane funkcje
Funkcja sqrt()
służąca do obliczania pierwiastków kwadratowych jest jedyną wbudowaną funkcją matematyczną POSIX bc. Inne funkcje są dostępne w zewnętrznej bibliotece standardów.
Wbudowana jest również funkcja scale() do określania precyzji (podobnie jak zmienna scale) jej argumentu oraz funkcja length() do określania liczby znaczących cyfr dziesiętnych
w jej
argumencie .
Standardowe funkcje biblioteki
Standardowa biblioteka matematyczna bc (zdefiniowana za pomocą opcji -l ) zawiera funkcje do obliczania sinusa , cosinusa , arcus tangensa , logarytmu naturalnego , funkcji wykładniczej i dwuparametrowej funkcji Bessela J. Za ich pomocą można skonstruować większość standardowych funkcji matematycznych (w tym inne odwrotne funkcje trygonometryczne). Zobacz zewnętrzne linki do implementacji wielu innych funkcji.
komenda BC | Funkcjonować | Opis |
---|---|---|
s(x)
|
Sinus | Przyjmuje x , kąt w radianach |
c(x)
|
Cosinus | Przyjmuje x , kąt w radianach |
topór)
|
Arcus tangens | Zwraca radiany |
l(x)
|
Naturalny logarytm | |
były)
|
Funkcja wykładnicza | |
j(n,x)
|
Funkcja Bessela | Zwraca kolejność n funkcji Bessela x . |
Opcja -l zmienia skalę na 20, więc rzeczy takie jak modulo mogą działać nieoczekiwanie. Na przykład wpisanie bc -l
, a następnie polecenie print 3%2
daje wynik 0. Ale wpisanie scale=0
po bc -l
, a następnie polecenie print 3%2
spowoduje wyświetlenie 1.
Plan 9 pne
Plan 9 bc jest identyczny z POSIX bc, ale zawiera dodatkową instrukcję print
.
GNU pne
GNU bc wywodzi się ze standardu POSIX i zawiera wiele ulepszeń. Jest całkowicie oddzielony od opartych na DC implementacji standardu POSIX i zamiast tego jest napisany w C. Niemniej jednak jest w pełni kompatybilny wstecz, ponieważ wszystkie programy POSIX bc będą działać niezmodyfikowane jako programy GNU bc.
Zmienne, tablice i nazwy funkcji GNU bc mogą zawierać więcej niż jeden znak, z C dołączono więcej operatorów, a zwłaszcza po klauzuli if
może następować instrukcja else
.
Dane wyjściowe są uzyskiwane albo przez celowe nieprzypisywanie wyniku obliczenia do zmiennej (sposób POSIX), albo przez użycie dodanej instrukcji print
.
Ponadto instrukcja read
umożliwia interaktywne wprowadzanie liczby do trwającego obliczenia.
Oprócz komentarzy w stylu C znak #
spowoduje, że wszystko po nim, aż do następnej nowej linii, zostanie zignorowane.
Wartość ostatniego obliczenia jest zawsze przechowywana w dodatkowej wbudowanej ostatniej
zmiennej.
Dodatkowi operatorzy
Następujące operatory logiczne są dodatkowymi operatorami w POSIX bc:
&& || !
Można ich używać w instrukcjach warunkowych (takich jak instrukcja if
). Należy jednak zauważyć, że nadal nie ma równoważnych operacji bitowych lub operacji przypisania.
Funkcje
Wszystkie funkcje dostępne w GNU bc są dziedziczone z POSIX. Żadne dodatkowe funkcje nie są dostarczane w standardzie z dystrybucją GNU.
Przykładowy kod
Ponieważ operator bc ^
dopuszcza potęgę całkowitą tylko po swojej prawej stronie, jedną z pierwszych funkcji, jakie może napisać użytkownik bc, jest funkcja potęgowa z wykładnikiem zmiennoprzecinkowym. Oba poniższe zakładają, że dołączono standardową bibliotekę:
Funkcja „mocy” w POSIX bc
0
/* Funkcja zwracająca część całkowitą liczby x */ zdefiniuj i ( x ) { auto s s = skala skala = x /= 1 /* zaokrąglenie x w dół */ skala = s powrót ( x ) } /* Użyj faktu, że x^y == e^(y*log(x)) */ zdefiniuj p ( x , y ) { if ( y == ja ( y )) { return ( x ^ y ) } return ( e ( y * l ( x ) ) ) }
Obliczanie π do 10000 cyfr
Oblicz pi za pomocą wbudowanej funkcji arcus tangens , a() :
$ bc -lq scale=10000 4*a(1) # Atan 1 to 45 stopni, czyli pi/4 w radianach.
# Obliczenie może zająć kilka minut.
Przetłumaczona funkcja C
Ponieważ składnia bc jest podobna do składni C , opublikowane funkcje numeryczne napisane w C często można dość łatwo przetłumaczyć na bc, co natychmiast zapewnia arbitralną precyzję bc. Na przykład w Journal of Statistical Software (lipiec 2004, tom 11, wydanie 5) George Marsaglia opublikował następujący kod C dla skumulowanego rozkładu normalnego :
0
podwójne Phi ( podwójne x ) { długie podwójne s = x , t = , b = x , q = x * x , ja = 1 ; podczas gdy ( s != t ) s = ( t = s ) + ( b *= q / ( ja += 2 )); return .5 + s * exp ( -.5 * q -.91893853320467274178L ); }
Po wprowadzeniu pewnych koniecznych zmian w celu uwzględnienia innej składni bc i uświadomieniu sobie, że stała „0,9189…” to tak naprawdę log(2*PI)/2, można to przetłumaczyć na następujący kod GNU bc:
0
zdefiniuj phi ( x ) { auto s , t , b , q , ja , const s = x ; t = ; b = x ; q = x * x ; ja = 1 podczas gdy ( s != t ) s = ( t = s ) + ( b *= q / ( ja += 2 )) const = 0,5 * l ( 8 * za ( 1 )) # 0,91893 ... powrót .5 + s * e ( - .5 * q - const ) }
Używanie bc w skryptach powłoki
bc może być używany nieinteraktywnie, z wejściem przez potok . Jest to przydatne wewnątrz skryptów powłoki . Na przykład:
$ wynik = $( echo "skala=2; 5 * 7 /3;" | bc ) $ echo $ wynik 11,66
W przeciwieństwie do tego, zauważ, że powłoka bash wykonuje tylko działania arytmetyczne na liczbach całkowitych, np.:
$ wynik = $(( 5 * 7 / 3 )) $ echo $ wynik 11
Można również użyć idiomu here-string (w bash, ksh, csh):
$ bc -l <<< "5*7/3" 11,66666666666666666666
Zobacz też
- The Single UNIX Specification , Version 4, The Open Group : język arytmetyki o dowolnej precyzji — Shell and Utilities Reference,
- Strona podręcznika GNU bc
- Strona podręcznika POSIX bc
- planu 9 , tom 1 - Podręcznik programisty
- 7th Edition Unix bc strona podręcznika
- Artykuł na stronie comp.compilers dotyczący projektowania i implementacji C-bc
- 6th Edition Unix kod źródłowy bc , pierwsze wydanie bc, od maja 1975, kompilacja składni bc do składni dc
- Kod źródłowy GNU pne
Linki zewnętrzne
- Dittmer, I. 1993. Błąd w poleceniach uniksowych dc i bc dla arytmetyki wielokrotnej precyzji. SIGNUM Newsl. 28, 2 (kwiecień 1993), 8–11.
- Zbiór przydatnych funkcji GNU bc
- GNU bc (oraz wersja alfa ) z Fundacji Wolnego Oprogramowania
- bc dla Windows z GnuWin32
- Gavin Howard bc - kolejna implementacja open source bc autorstwa Gavina Howarda z rozszerzeniami GNU i BSD
-
X-bc — graficzny interfejs użytkownika do bc
- extensions.bc - zawiera funkcje trygonometrii, funkcje wykładnicze, funkcje teorii liczb i niektóre stałe matematyczne
- science_constants.bc - zawiera masy cząstek, podstawowe stałe, takie jak prędkość światła w próżni i stała grawitacji