Pular para o conteúdo

Shell - operações envolvendo números em ponto flutuante

Dica publicada em Shell Script / Avançado
Sandro Marcell SMarcell
Hits: 28.191 Categoria: Shell Script Subcategoria: Avançado
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Shell - operações envolvendo números em ponto flutuante

Dica simples que mostra como proceder para realizar operações aritméticas que envolvam números em ponto flutuante no shell. Sem muita enrolação, vamos direto ao ponto.

Para realizar esse tipo de operação no zsh basta:

(( x = 13.287 / 4.63 ))
$ print $x
2.86976...

Já no ksh (ksh93) altere o valor da variável built-in LC_NUMERIC:

LC_NUMERIC=C
$ (( x = 13.287 / 4.63 ))
$ print $x
2.86976...

NOTA: No zsh/ksh é possível definir a quantidade de dígitos após o ponto decimal utilizando a opção "typeset -F valor nome_da_variável" antes da operação desejada. Nos exemplos acima poderíamos fazer "typeset -F 5 x".

O Bash (assim como o sh, ash, csh) não possui suporte nativo a esse tipo de operação, sendo necessário o uso de comandos externos tais como bc ou dc:

Comando bc:

echo "scale=5 ; 13.287 / 4.63" | bc
ou
bc <<< "scale=5 ; 13.287 / 4.63" *
2.86976

* Redirecionador válido somente no zsh, ksh e bash

Comando dc (calculadora RPN):

dc -e "5k 13.287 4.63 / p"
2.86976

Apêndice: Realizando comparações numéricas

Para realizar comparações o mesmo conceito acima pode ser aplicado.

No zsh:

(( 13.287 > 4.63 )) && print Maior || print Menor
Maior
[[ 13.287 -gt 4.63 ]] && print Maior || print Menor
Maior

Novamente no ksh:

LC_NUMERIC=C
$ (( 13.287 > 4.63 )) && print Maior || print Menor

Maior
[[ 13.287 -gt 4.63 ]] && print Maior || print Menor
Maior

Já no Bash, novamente deveremos utilizar comandos externos:

Comando bc:

NOTA: O bc ao realizar comparações numéricas retorna '0' para falso e '1' para verdadeiro.

echo "13.287 > 4.63" | bc
ou
bc <<< "13.287 > 4.63" *
1

* Redirecionador válido somente no zsh, ksh e bash

Comando dc (a título de curiosidade!):

dc -e "[[Maior]p sx] 13.287 4.63 > x"
Maior

Pronto! =)

Mais detalhes (salve seu dia, consulte as man pages!):

man zsh
$ man ksh
$ man bash
$ man bc
$ man dc


Falou!!! ;)

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Renomeando arquivos simultaneamente com apenas uma linha de comando

Copiando arquivos e mantendo a estrutura original de diretórios

AWK - Validando endereços IPv4

FreeBSD: "chroot" num pool de armazenamento em ZFS

Wget: Verificando existência de arquivo remoto

Instalador Skype automatizado - Zenity

Fazendo backup ou cópia somente dos arquivos alterados no último dia

Configurar Gedit para compilar e executar scripts em PASCAL

Redimensionando e renomeamento imagens em massa

Backup do Nagios

#1 Comentário enviado por SMarcell em 16/12/2009 - 08:29h
Trabalhar com números em ponto flutuante sempre requer um pouco mais de atenção.

$ print $((80.12 + 19.45))
99.570000000000007

$ (( 80.12 + 19.45 == 99.57 )) && print Igual || print Diferente
Diferente

Agora:

$ (( x = 80.12 + 19.45 ))
$ (( $x == 99.57 )) && print Igual || print Diferente
Igual

=)

Contribuir com comentário

Entre na sua conta para comentar.