Digamos que eu tenha uma variável e queira imprimir 5 dígitos significativos depois de multiplicá-la por 1000 zsh
.
zsh$ x=2.8026407e+00
zsh$ printf "%.5g\n" "$(( 1000*${x} ))"
zsh> 2802.6
Pode bash
fazê-lo também?
bash$ x=2.8026407e+00
bash$ printf "%.5g\n" "$(( 1000*${x} ))"
bash> bash: 1000*2.8026407e+00 : syntax error: invalid arithmetic operator (error token is ".8026407e+00 ")
Eu acho que não há como fazer o bash nativo entender as operações de ponto flutuante, não é? Eu sei que posso usar, por exemplo awk
, mas eu queria saber se bash
poderia fazer isso ou não.
(Não estou surpreso que bash
não possa lidar com carros alegóricos, mas isso zsh
pode!)
bash
não faz aritmética de ponto flutuante, mas sim de ponto fixo, onde o decimal é fixado em zero casas (ou seja, matemática inteira). Isso significa que você pode contornar isso para alguns cálculos muito básicos:Assim, 1/3 a três casas é 0,333.
Esta é uma má ideia; não faça isso.
Há muitas maneiras de fazer matemática FP na linha de comando. Aqui estão apenas dois exemplos:
bash
não pode fazer operações matemáticas de ponto decimal, apenas operações inteirasSim, como traço, bash é limitado a matemática aritmética inteira em
$((…))
.Na verdade, por padrão, todos os shells (padrão POSIX) imprimirão 37 com isto:
De [POSIX][1]:
Você precisa alterar um pouco os números para obter matemática de ponto flutuante em ksh, zsh e yash (não jsh, dash, ash, lksh, mksh e bash):
Mas tenha cuidado com a precedência e a precisão do zsh:
Limites de truncamento zsh inesperados:
Existe uma solução alternativa no bash usando os recursos printf (limitado a ~ 10 dígitos):
Mas por que se incomodar em ter
bc
disponível:[1]: Somente a aritmética de inteiro longo com sinal é necessária.
Não usando o bash especificamente, mas você deve ter
bc
disponível para você: