Calculando raizes de equações do segundo grau com o dc

Introdução

Brincando hoje com o dc resolvi criar um código que retorne as raízes reais de uma equação do segundo grau. Por incrível que pareça todos os códigos do dc podem ser one-lines, ou seja, com apenas uma linha de código podemos realizar tarefas complexas.

O código

A linha seguinte calcula as raízes de uma equação do segundo grau:

1 _2 _3 sc _1 * sb sa _4 la lc * * lb 2 ^ + v sd lb ld + 2 la * / lb ld – la 2 * / f

Explicando:

1)

1 _2 _3

Esses são os coeficientes da equação x^2 – 2x – 3. Veja que os coeficientes negativos devem ser precedidos de ‘_’ e não de ‘-‘. Caso você queira testar com outros coeficientes, modifique somente esses 3 primeiros números.

2)

sc _1 * sb sa

Em seguida o código guarda nos registradores a, b e c os coeficientes da equação. Como o valor positivo de b não nos interessa, então é gravado o valor de -b.

3)

_4 la lc * * lb 2 ^ + v sd

Esse é o valor de raiz de delta (chamarei de rdelta). Antes do ‘+’ está o valor de delta e o “v sd”, tira a raiz dele e o sd, armazena rdelta no registrador d.

4)

lb ld + 2 la * /

Essa expressão calcula o valor da primeira raiz. Os valores de b e d são empilhados e uma soma entre eles é realizada. Logo depois empilha-se o 2 e o valor de a. Calcula-se 2*a e depois divide-se o valor de b+rdelta por 2a. Só estamos seguindo as regrinhas do nosso querido Bhaskara…

5)

lb ld – la 2 * /

Agora a segunda raiz. Empilhamos b e rdelta, mas agora realizamos uma subtração entre eles. Em seguida empilha-se o valor de a e a constante 2. Realiza-se a operação 2*a e divide a subtração b-rdelta por 2*a.

6)

f

Daqui para frente temos dois valores na pilha, que na verdade são os valores das duas raízes. Assim, para mostrar o conteúdo da pilha utiliza-se o comando f.

Script que calcula as raizes de uma equação

O script seguinte calcula as raizes de uma equação do segundo grau. As raizes devem ser obrigatoriamente reais caso contrário o script retorna erro (raiz de número negativo).

#!/bin/bash
# Autor: Daemonio (Marcos Paulo Ferreira)
# Contato: undefinido gmail com
#
# Script que calcula as raizes reais de
# uma equacao do segundo grau.
#
# Fri Jun 10 11:28:04 BRT 2011
#

function calc_raiz_dc() {
echo $1 $2 $3 '5k sc _1 * sb sa _4 la lc * * lb 2 ^ + v sd lb ld + 2 la * / lb ld - la 2 * / f' | dc
}
# Coeficientes
coe_a=
coe_b=
coe_c=

# Leitura dos coeficientes
read -p 'coeficiente a: ' coe_a
read -p 'coeficiente b: ' coe_b
read -p 'coeficiente c: ' coe_c

# Troca o sinal '-' por '_'
coe_a=${coe_a/-/_}
coe_b=${coe_b/-/_}
coe_c=${coe_c/-/_}

# Chama a funcao e formata a saida com o sed
calc_raiz_dc $coe_a $coe_b $coe_c | sed 'N;s/^/raiz1: /;s/\n/&raiz2: /'

Baixe o código em: http://www.vivaolinux.com.br/script/Raizes-de-equacoes-do-2o-grau-no-dc (confira também o comentário)

Referências

[1] http://www.vivaolinux.com.br/artigo/A-magica-do-dc/

[2] http://en.wikipedia.org/wiki/Dc_%28computer_program%29

Deixe um comentário