Operação de flutuação com bc?

42

Parece que o bc não suporta operações de flutuação, quando faço echo 1/8 | bcisso obtém um zero.

Eu verifiquei bc (1), mas ele nem menciona float, então eu me pergunto se é suportado?

margarida
fonte
9
echo "scale=4; 1/8" | bc
Liuyan刘研
Esta pergunta e, em particular, a resposta aceita podem ser interessantes para você.
Emanuel Berg

Respostas:

56

bcnão usa ponto flutuante, mas números decimais de precisão fixos. A -lbandeira que Hauke ​​menciona carrega uma biblioteca de matemática, por exemplo. funções trigonométricas, mas isso também significa

[...] a escala padrão é 20

scaleé uma das várias "variáveis ​​especiais" mencionadas na página do manual. Você pode configurá-lo:

scale=4

Quando você quiser (se -lfoi usado ou não). Refere-se ao número de dígitos significativos usados ​​em um decimal . Em outras palavras, as soluções subsequentes serão arredondadas para esse número de dígitos após a escala decimal (== precisão fixa).

A escala padrão sans -lé 0, o que significa arredondado para números inteiros.

Cachinhos Dourados
fonte
27

A página de manual diz:

Se bc é chamado com a opção -l, uma biblioteca de matemática é pré-carregada [...]

A compreensibilidade disso poderia ser melhorada, de fato ...

Hauke ​​Laging
fonte
14
Relatá-lo a montante como um erro ...
vonbrand
0

1) Os números em bc têm uma escala. A escala de um número não deve ser confundida com o fator de escala. A mesma escala mundial é usada como uma função para consultar a escala de um número ou como um parâmetro para definir o fator de escala.

echo "scale=scale(1.1);11/10" | bc will return 1.1

2) O fator de escala determina quantos dígitos são mantidos à direita do ponto decimal ao executar operações. Se s é o fator de escala atual, sa é a escala do primeiro operando a, sb é a escala do segundo operando b, os resultados são truncados da seguinte maneira:

    scale of result
a+b     max(sa,sb)
a-b     max(sa,sb)
a*b     min(sa+sb , max(s,sa,sb))
a/b     s
a%b     so that a = b*quotient + remainder; remainder has sign of a
a^b     min(sa×|b|, max(s,sa)); b must be integer
sqrt(a) max(s,sa)

3) Na origem, bc era um pré-processador de dc. Agora, em muitos sistemas, o bc é um programa independente.

Fonte: [ https://plan9.io/magic/man2html/1/dc]

cd9
fonte