Mnożenie na terminalu wiersza poleceń


115

Używam terminala szeregowego, aby zapewnić dane wejściowe do naszego eksperymentu laboratoryjnego. Znalazłem to za pomocą

$ echo "5X5"

po prostu zwraca ciąg "5X5". Czy istnieje polecenie wykonania operacji mnożenia?

Odpowiedzi:



45

Aby uzyskać bardziej zaawansowaną i precyzyjną matematykę, rozważ użycie bc (1).

echo "3 * 2.19" | bc -l 
6.57

19

Metody wewnętrzne

Bash obsługuje ekspansję arytmetyczną z $(( expression )). Na przykład:

$ echo $(( 5 * 5 ))
25

Metody zewnętrzne

Szereg narzędzi zapewnia funkcje arytmetyczne, w tym bc i expr .

$ echo '5 * 5' | /usr/bin/bc
25

$ /usr/bin/expr 5 \* 5
25

15

Klasyczne rozwiązanie to:

 expr 5 \* 5

Inną fajną opcją jest:

 echo 5 5\*p | dc

Oba te rozwiązania będą działać tylko z operandami całkowitymi.


1
dcdziała z pływakami. Spróbuj echo '4 k 50 7 / p' | dc. Wynik jest 7.1428. kPolecenie ustawia precyzję.
Wstrzymano do odwołania.

@Dennis W dwóch różnych implementacjach dc widzę, że operacje float działają bez przypisywania przez k. Z pewnością pamiętam domyślną dokładność równą 0 (obcięcie do liczby całkowitej). Czy źle pamiętam, czy po prostu nowsze implementacje zmieniły zachowanie?
William Pursell

dcPrzez lata używałem rzadko, ponieważ jestem bardziej algebraiczny i mniej RPN, więc nie pamiętam. W systemie GNU, którego używam, wartością domyślną jest 0. Stara (1993) manstrona FreeBSD wspomina, że ​​domyślną wartością jest zero, ale starsze manstrony BSD nie.
Wstrzymano do odwołania.

Nawiasem mówiąc (dla przyszłych czytelników), mój przykład powinien był pokazywać niecałkowite operandy zamiast tylko niecałkowitego wyniku, aby dokładnie przeciwdziałać twierdzeniu. Nie bój się, echo '4 k 50.5 7 / p' | dcdziała (wyjście:) 7.2142.
Wstrzymano do odwołania.

8

Prosta funkcja powłoki (bez seda) powinna załatwić sprawę interpretacji „5X5”

$ function calc { bc -l <<< ${@//[xX]/*}; };
$ calc 5X5
25
$ calc 5x5
25
$ calc '5*5'
25

6

Używam tej funkcji, która używa bci tym samym obsługuje obliczenia zmiennoprzecinkowe:

c () { 
    local a
    (( $# > 0 )) && a="$@" || read -r -p "calc: " a
    bc -l <<< "$a"
}

Przykład:

$ c '5*5'
25
$ c 5/5
1.00000000000000000000
$ c 3.4/7.9
.43037974683544303797

Rozwinięcie arytmetyczne Basha nie obsługuje pływaków (ale powłoka Korna i zsh tak).

Przykład:

$ ksh -c 'echo "$((3.0 / 4))"'
0.75

4

Mam do tego prosty skrypt:

me@mycomputer:~$ cat /usr/local/bin/c

#!/bin/sh

echo "$*" | sed 's/x/\*/g' | bc -l

Zmienia się xna, *ponieważ *jest to znak specjalny w powłoce. Użyj go w następujący sposób:

  • c 5x5
  • c 5-4.2 + 1
  • c '(5 + 5) * 30' (nadal musisz używać cudzysłowów, jeśli wyrażenie zawiera nawiasy).

Podoba mi się twój pomysł na użycie „x” do mnożenia. Podobnie możesz użyć nawiasów kwadratowych zamiast nawiasów, aby uniknąć konieczności cytowania. trmoże służyć do mapowania znaków dla wielu znaków.
Wstrzymano do odwołania.

3

Jeśli lubisz Pythona i masz możliwość zainstalowania pakietu, możesz użyć tego narzędzia, które stworzyłem.

# install pythonp
python -m pip install pythonp

pythonp "5*5"
25

pythonp "1 / (1+math.exp(0.5))"
0.3775406687981454

# define a custom function and pass it to another higher-order function
pythonp "n=10;functools.reduce(lambda x,y:x*y, range(1,n+1))"     
3628800
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.