Descrição
Como calcular raiz quadrada em bash? Algumas linguagens tem o sqrt, mas o bash como poderia ser.
[ Download:
raiz.sh ]
[
Enviar nova versão ]
[ Esconder código-fonte ]
#!/bin/bash
# Comentarios: muitas linguagens tem o operador de raiz quadrada ou uma funcao
# implementada que a realiza. Normalmente esta funcao recebe o nome de sqrt
# pyton e pearl tem este operador
# Em linux pode-se usar as calculadoras dc para ter o mesmo efeito:
#
# echo "144 v p"|dc
#
# mas digamos que isto nao tem graca, pois se usou um comando externo, o dc,
# que foi feito em C. Legal mesmo eh o calculo em bash puro
# Para isto teria-se que usar a calculadora interna do bash, invocada por
# $(( ... ))
#
# a funcao matematica que se segue eh muito usada e pode ser refinada. Quanto
# mais passos, mas se aproxima-se do valor
#
# Para usar, chame ./raiz.sh N
# onde N eh o numero da raiz quadrada (podem passar varios valores, como
# ./raiz 144 445 56 67
#
MAX=50 # Numero maximo de iteracoes que se faz.
for N in $*
do
I=0
R=$(( $N / 2))
while (( $I < $MAX ))
do
I=$(( $I + 1))
ANT=$R
R=$(( ($N/$R + $R) / 2 ))
if [ $ANT == $R ]
then
break
fi
done
echo Raiz quadrada de $N eh $R
done
# este codigo retorna apenas a parte INTEIRA da raiz quadrada pois a
# calculadora do bash nao trabalha com pontos flutuantes. Para ter
# casas decimais teria que usar o bc ou dc, e ai perderia a graca
Scripts recomendados
script para criar Maildir
Cadastro de usuarios para proxy autenticado
Script para gravar 2 (ou 4) CDs simultaneamente
POSTFIX AUTOMÁTICO COM MYSQL E IPTABLES - RESTAURANDO MBOX VIA SSH
calculadora
Comentários
[1] Comentário enviado por
SMarcell em 09/03/2009 - 09:24h:
Quanto a questão de operações com ponto flutuante, no Ksh e Zsh isso não é problema!
No ksh, operações com ponto flutuante dão um 'pouquinho' mais de trabalho:
$ LC_NUMERIC=C
$ float x=13.2 y=4.6
$ echo $((x + y))
17.8
Já no zsh:
$ echo $((13.2 + 4.6))
17.7999...
Só complementando o post... =)
---Editado---
[2] Comentário enviado por
elgio em 09/03/2009 - 09:31h:
Legal!
Então em zsh e ksh tem uma solução possível só com comandos INTERNOS (no bash tem que invocar o bc ou dc, mas se é para invocar o dc, o dc TEM sqrt).
Valeu pelo aprendizado.