strange behaviour with simple decimals



On 4/17/07, Andrey G. Grozin <A.G.Grozin at inp.nsk.su> wrote:
>
> I'd like to stress one general point about maxima (or any other CAS).
> maxima *always* transforms its input to its internal representation.


Absolutely!

One detail: "part" actually reformulates the internal form for human use.
Here's a little function to see what the internal form looks like a bit more
accurately:

showin(ex) :=
     block([inflag : true],
         if atom(ex) then ex
         else funmake(concat(" ", part(ex, 0)), map(showin, args(ex))))$

showin(1/x) => ^(x, - 1)      = x^(-1)
showin(x-y) => +(x,  *(- 1, y))     NOT +(x, -(y))
showin(1/3) => //(1, 3)      special form for rational numbers, not 3^(-1)
showin(x/(3*y)) => *( //(1, 3), x,  ^(y, - 1))    = 1/3 * x * y^(-1)  NOT x
* (3*y)^-1
showin(sqrt(1-x^2)) =>  ^( +(1,  *(- 1,  ^(x, 2))),  //(1, 2))  NOT
sqrt(...)
showin([a,b]) => [(a,b)     ... "[" is the list-forming operator

showin doesn't cover all cases (subscripting, bigfloats, CREs (created by
rat), complex applications), but it's good enough to show the idea.

To see the full unvarnished internal representation, you can use the Lisp
function ?print:

?print(1.5b0/x-1)$
((MPLUS SIMP) -1
 ((MTIMES SIMP) ((BIGFLOAT SIMP 56) 54043195528445952 1)
  ((MEXPT SIMP) $X -1)))

          -s