Re: Defining N for a new entity

• To: mathgroup at smc.vnet.net
• Subject: [mg66822] Re: Defining N for a new entity
• From: Giuseppe Bilotta <bilotta78 at hotpop.com>
• Date: Wed, 31 May 2006 06:31:39 -0400 (EDT)
• References: <200605280103.VAA23345@smc.vnet.net> <e5bsuq\$afo\$1@smc.vnet.net> <e5ei6d\$800\$1@smc.vnet.net> <e5h5p7\$ero\$1@smc.vnet.net>
• Sender: owner-wri-mathgroup at wolfram.com

```On Tue, 30 May 2006 10:11:51 +0000 (UTC), Peter Pein wrote:

>   just guessing...
>
> N[AffineExpression[c_,dev_]]:=... might evaluate the left hand side before applying SetDelayed. This is an explanation, why Mathematica doesn't complain about N being protected.
> But N[AffineExpression[c_,dev_]] evaluates to AffineExpression[c_,dev_], leaving you with a hidden recursion:
>
> N[f[x_]]:=f[N[x]]
> N[f[13]] (* choose your favourite unlucky number here *)
>
> reproduces the crash.
>
> If you don't want the NHoldRest-solution, you might try:
>
> In[1]:=
> a1=AffineExpression[1,{{1,1},{2,Pi}}];
>
> AffineExpression /: HoldPattern[N][AffineExpression[c_, dev_]] :=
>      AffineExpression[N[c], MapAt[N, #, 2]& /@ dev]
>
> N[a1]
> --> AffineExpression[1.,{{1,1.},{2,3.14159}}]

Hello Peter, thank you very much, this seems to be the case indeed.
Interestingly, even with this definition the Numericization done by
LinearSolve *still* seems to apply to the whole AffineExpression, so I
guess I will have to use both the HoldPattern[N] *and* the NHoldRest
strategy.