BC não manipula escala = 0 corretamente

5

Eu defini a função cbrt para retornar uma raiz cúbica. Eu preciso obter um número inteiro de volta (mesmo que seja perto da raiz cúbica, será aceitável no meu caso). No entanto, quando eu coloco a escala como 0 para obter um inteiro, recebo números que são grosseiramente incorretos. O que está acontecendo e como obtenho um inteiro root cube out?

bc -l
define cbrt(x) { return e(l(x)/3) }
scale=1;cbrt(1000000)
99.4
scale=0;cbrt(1000000)
54
    
por Alastor Moody 20.08.2013 / 21:15

1 resposta

4

A definição de scale antes de chamar cbrt() tem o efeito de definir scale enquanto cbrt() é avaliado. O caminho é esconder a escala como parte da função:

define cbrt(x) { auto z, var; z=scale; scale=5; var = e(l(x)/3); scale=z; return (var); }

que, quando chamado, dá:

scale=0; cbrt(1000000)
99.99998

O que parece ignorar esse scale=0 . Isso ocorre porque ele avalia cbrt() que temporariamente define o scale para 5 e calcula sua raiz cúbica (para 5 pontos flutuantes), atribui isso a z e retorna esse valor (que implicitamente tem scale definido como 5). Você pode aplicar o scale=0 local simplesmente dividindo por 1:

scale=0; cbrt(100000)/1
99
    
por 20.08.2013 / 21:48

Tags