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