Komut satırı terminalinde çarpma


115

Laboratuvar deneyimize girdi sağlamak için bir seri terminal kullanıyorum. Bunu kullanarak buldum

$ echo "5X5"

sadece bir dizi döndürür "5X5". Çarpma işlemini yürütmek için bir komut var mı?

Yanıtlar:



45

Daha gelişmiş ve kesin matematik için bc (1) kullanmayı düşünün.

echo "3 * 2.19" | bc -l 
6.57

19

Dahili Yöntemler

Bash destekleyen aritmetik ile $(( expression )). Örneğin:

$ echo $(( 5 * 5 ))
25

Harici Yöntemler

Bir dizi yardımcı program, bc ve ifade de dahil olmak üzere aritmetik sağlar .

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

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

15

Klasik çözüm şudur:

 expr 5 \* 5

Bir başka güzel seçenek ise:

 echo 5 5\*p | dc

Bu çözümlerin her ikisi de yalnızca tamsayı işlenenlerle çalışacaktır.


1
dcşamandıralarla çalışır. Deneyin echo '4 k 50 7 / p' | dc. Çıktı 7.1428. kKomut hassasiyet ayarlar.
sonraki duyuruya kadar duraklatıldı.

@Dennis DC'nin iki farklı uygulamasında, float işlemlerinin aracılığıyla atamadan çalıştığını görüyorum k. Varsayılan kesinliğin 0 olduğunu kesinlikle hatırlıyorum (tamsayıya kısaltma). Yanlış hatırlıyor muyum yoksa sadece yeni uygulamalar davranışı değiştirdi mi?
William Pursell

dcDaha cebirsel ve daha az RPN olduğum için yıllardır nadiren kullandım , bu yüzden hatırlamıyorum. Kullandığım bir GNU sisteminde varsayılan değer 0'dır. Eski (1993) bir FreeBSD mansayfası varsayılanın sıfır olduğundan bahseder, ancak eski BSD mansayfaları bunu yapmaz.
sonraki duyuruya kadar duraklatıldı.

Bu arada (gelecekteki okuyucular için), benim örneğim , iddiayı doğru bir şekilde karşılamak için yalnızca tamsayı olmayan bir sonuç yerine tamsayı olmayan işlenenler göstermelidir . Asla korkmayın, echo '4 k 50.5 7 / p' | dcçalışır (çıktı:) 7.2142.
sonraki duyuruya kadar duraklatıldı.

8

Basit bir kabuk işlevi (sed gerekmez) '5X5'i yorumlama hilesini yapmalıdır

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

6

bcKayan nokta hesaplamalarını kullanan ve dolayısıyla destekleyen bu işlevi kullanıyorum :

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

Misal:

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

Bash'in aritmetik genişlemesi kayan sayıları desteklemez (ancak Korn kabuğu ve zsh bunu destekler).

Misal:

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

4

Bunun için kullandığım basit bir komut dosyam var:

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

#!/bin/sh

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

Bu değişiklikler xiçin *çünkü *kabuğunda özel bir karakterdir. Aşağıdaki gibi kullanın:

  • c 5x5
  • c 5-4.2 + 1
  • c '(5 + 5) * 30' (ifade parantez içeriyorsa yine de tırnak işareti kullanmanız gerekir).

Çarpma işlemi için "x" kullanma fikrini beğendim. Alıntı yapma ihtiyacını ortadan kaldırmak için benzer şekilde parantez yerine köşeli parantez kullanabilirsiniz. trbirden çok karakter için karakter eşlemesi yapmak için kullanılabilir.
sonraki duyuruya kadar duraklatıldı.

3

Python'u seviyorsanız ve bir paket yükleme seçeneğiniz varsa, benim yaptığım bu yardımcı programı kullanabilirsiniz .

# 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.