MathGroup Archive 2001

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Preserve natural number "e" using N or SetPrecision

  • To: mathgroup at smc.vnet.net
  • Subject: [mg30922] Re: Preserve natural number "e" using N or SetPrecision
  • From: "Allan Hayes" <hay at haystack.demon.co.uk>
  • Date: Thu, 27 Sep 2001 02:16:39 -0400 (EDT)
  • References: <9o973r$cfd$1@smc.vnet.net> <9oc76p$fue$1@smc.vnet.net> <9ojung$m0k$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Kevin,

You may be seeing something like:

with Block:

    NSaveE[expr_, prec___] := Block[{E = ee},
    N[expr, prec]
    ] /. ee -> E

    NSaveE[E]

        E

but, with Module

    NSaveEMod[expr_, prec___] := Module[{E = ee},
    N[expr, prec]
    ] /. ee -> E

    NSaveEMod[E]

        2.718281828459045

This is because:
When NSaveEMod[E] is evaluated,
the E in Module[{E=ee}, body] is protected against being confused with any E
coming from outside, by being renamed to E$ (this is to do with scoping).
Only after this is E from NSaveEMod[E] passed to replace expr in Module[..],
so that we have

    Module[{E$ = ee},
        N[E]
    ] /. ee -> E

Which is then evaluated and gives the result that you see.
You can follow the process by evaluating

    TracePrint[NSaveEMod[E]]

Three further points:
1) we have automatic changes like

    {1.2 E, E^1.2}

        {3.261938194150854, 3.3201169227365472}

To deal with these may need some holding or a dummy version of E.

2) N works on held expressions, for example:

    N[HoldComplete[E]]

        HoldComplete[2.718281828459045]

But  NSaveE, and NSaveMod,  work with assignments they do not work on  held
expressions.
For example

    NSaveE[HoldComplete[E]]

        HoldComplete[2.718281828459045]

We can get round this by using replacement

    NSaveERep[expr_,prec___]:=
    Module[{ee},
        N[expr/.E->ee,prec]/.ee->E
    ]

    NSaveERep[HoldComplete[E]]

        HoldComplete[E]

But we still have

    NSaveERep[Pi E]

        8.539734222673566

A simple, dummy E, solution is

    NSaveERepDum[expr_,prec___]:=
        N[expr/.{E:>ee},prec]

    NSaveERepDum[Pi E]

        3.141592653589793*ee

A holding solution is

    NSaveERepHF[expr_,prec___]:=
    Module[{ee},
        N[expr/.E->ee,prec]/.ee->HoldForm[E]
    ]

    NSaveERepHF[Pi E]

        3.141592653589793*HoldForm[E]

3) Another problem to  do with holding

    Hold[Exp[Pi]]/.E->ee

        Hold[E^Pi]

This is because it is only during evaluation that Exp[x] is converted to
E^x.
(the following is misleading

    Hold[Exp[Pi]]

        Hold[E^Pi]

we have in fact

    FullForm[Hold[Exp[Pi]]]

        FullForm[Hold[Exp[Pi]]]

)

This  may  not seem too bad since we have, for example

    NSaveERepDum[Hold[Exp[Pi]]]

        Hold[E^3.141592653589793]

But if may preferr to have a uniform treatment , for example:

NSaveERepDum2[expr_,prec___]:=
N[expr/.E:>ee, prec]//.HoldPattern[Exp[x_]]:>ee^x

    NSaveERepDum2[Hold[Exp[Pi]]]

        Hold[ee^3.141592653589793]

(this may need more work)

--
Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565

"Kevin J. McCann" <kevinmccann at Home.com> wrote in message
news:9ojung$m0k$1 at smc.vnet.net...
> I get a very strange error if I replace Block with Module in the function
> below.
>
> "Jens-Peer Kuska" <kuska at informatik.uni-leipzig.de> wrote in message
> news:9oc76p$fue$1 at smc.vnet.net...
> > Hi,
> >
> > NSaveE[expr_, prec___] := Block[{E = ee},
> >       N[expr, prec]
> >       ] /. ee -> E
> >
> >
> > will do it.
> >
> > Regards
> >   Jens
>
>
>






  • Prev by Date: Re: Preserve natural number "e" using N or SetPrecision
  • Next by Date: Re: Handling several variables at once during matrix multiplications
  • Previous by thread: Re: Preserve natural number "e" using N or SetPrecision
  • Next by thread: speed comparison of Strong pseudoprime test and Lucas test