Erro de sintaxe comparando floats com bc

2

Estou tentando usar o operador de comparação de bc e estou recebendo um erro "erro de sintaxe na linha 1 stdin". Eu preciso usar a funcionalidade de comparação dentro de um script korn porque o korn não manipula bem os pontos flutuantes. Exemplo de uso abaixo:

echo "scale=2; 3.2 > 3" | bc
    
por Ben 25.10.2011 / 17:11

3 respostas

2

O que você fez deveria ter funcionado; Ele está em conformidade com bc conforme especificado pelo POSIX. No entanto, bc é uma ferramenta relativamente pouco usada e algumas implementações podem ter erros. Se você não estiver usando funções matemáticas mais avançadas que +-*/ e comparações, poderá usar awk ; até mesmo a implementação original por A, W e K suportou aritmética de ponto flutuante.

echo 3.2 | awk '{exit !($0 > 3)}'
    
por 26.10.2011 / 09:39
1

O expr pode lidar com comparações de float como essa, muito bem.

ksh -c '(( $(expr 3.2 \> 3) == 1 )) && echo 1 || echo 0'

ou use-o em um script, como:

#!/usr/bin/ksh

if [ $(expr $1 \> $2) == 1 ]; then
    echo "greater"
else 
    echo "lesser"  
fi

você pode achar que expr é mais portável, porque a linha bc que você está usando acima funciona no linux, mas não no solaris. usar expr deve funcionar da mesma forma em qualquer um desses sistemas operacionais.

    
por 25.10.2011 / 17:53
1

Se disponível, tente dc :

echo "2 k 3.2 3 [1p] sa <a" | dc

Note que o acima também usará 2 precisão decimal e produzirá 1 se o primeiro número (3,2 no exemplo acima) for maior que o segundo número (3 acima). Mas caso contrário, nada será produzido.

dc é o irmão de bc , na documentação GNU descrita com as mesmas palavras “calculadora de precisão arbitrária”. Em algumas distribuições eles são enviados no mesmo pacote, em outras distribuições eles são empacotados separadamente.

    
por 25.10.2011 / 20:41

Tags