pne (język programowania)

pne
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.

Standardowa biblioteka bc
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ż

Linki zewnętrzne