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