Comando Unix para retornar o valor máximo de flutuação de dois após a subtração

0

Isso é semelhante a pergunta sobre como obter o mínimo / máximo de dois números , mas estou interessado em faça o mesmo com números flutuantes.

Então, basicamente, estou tentando usar a expansão aritmética da casca usando o operador ternário, mas só funciona para os inteiros.

Por exemplo, eu gostaria de pegar dois números e subtrair alguns números e verificar se o resultado está acima de zero, se não, configurá-lo acima de zero.

Inteiros

Isso funciona muito bem:

value=5
echo $(( $(bc <<< "$value - 10") > 0 ? $(bc <<< "$value - 10") : 1 ))

e devolve 1 conforme esperado.

Flutuadores

No entanto, quando estou tentando convertê-lo em comparação de flutuação, isso não funciona, por exemplo,

value=0.5
echo $(( $(bc <<< "$value - 0.8") > 0 ? $(bc <<< "$value - 0.8") : 0.1 ))

que indica o erro:

-bash: -.3 > 0 ? -.3 : 0.1 : syntax error: operand expected (error token is ".3 > 0 ? -.3 : 0.1 ")

Apesar de bc estar retornando o número da direita:

$ echo $(bc <<< "$value - 0.8")
-.3

Eu presumo que o bash não pode lidar com essa comparação de float.

Existe alguma solução simples para obter min / max para os números flutuantes (como explicado acima)?

    
por kenorb 28.06.2016 / 12:04

1 resposta

1

Ok, eu criei este simples one-liner usando bc para comparar os valores e o shell fazendo o resto:

$ value=0.5
$ [ $(bc <<< "$value - 0.8 > 0") -eq 1 ] && echo $(bc <<< "$value - 0.8") || echo 0.1
0.1
$ [ $(bc <<< "$value - 0.2 > 0") -eq 1 ] && echo $(bc <<< "$value - 0.2") || echo 0.1
.3

Ou usando bc it-self, por exemplo

v=0.5
bc <<< "if ($v-0.8>0) $v-0.8 else 0.1" # Result: .1
bc <<< "if ($v-0.2>0) $v-0.2 else 0.1" # Result: .3
    
por 28.06.2016 / 12:19