:

## Old bug in `diff/abs`

Maple

diff(abs(z), z)  returns abs(1, z)  and the latter, for a numeric z, is defined only for a nonzero real z.
However,  functions such as abs(I+sin(t)) are (real) differentiable for a real t and diff should work. It usually does, but not always.

```restart
f:= t -> abs(GAMMA(2*t+I)):  # We want D(f)(1)
D(f)(1):
evalf(%);  # Error, (in simpl/abs) abs is not differentiable at non-real arguments
D(f)(1); simplify(%);
evalf(%);   # 0.3808979508 + 1.161104935*I,  wrong
```

The same wrong results are obtained with diff instead of D

```diff(f(t),t):   # or  diff(f(t),t) assuming t::real;
eval(%,t=1);
simplify(%); evalf(%);   # wrong, should be real
```

To obtain the correct result, we could use the definition of the derivative:

```limit((f(t)-f(1))/(t-1), t=1); evalf(%); # OK
fdiff(f(t), t=1);    # numeric, OK
```

0.8772316598
0.8772316599

Note that abs(1, GAMMA(2 + I)); returns 1; this is also wrong, it should produce an error because  GAMMA(2+I) is not real;

Let's redefine now `diff/abs`  and redo the computations.

```restart
`diff/abs` := proc(u, z)   # implements d/dx |f(x+i*y|) when f is analytic and f(...)<>0
local u1:=diff(u,z);
1/abs(u)*( Re(u)*Re(u1) + Im(u)*Im(u1) )
end:
f:= t -> abs(GAMMA(2*t+I));
D(f)(1); evalf(%);   # OK now
```

0.8772316597

Now diff works too.

```diff(f(t),t);
eval(%,t=1);
simplify(%); evalf(%);   # it works
```

This is a probably a very old bug which may make diff(u,x)  fail for expressions having subespressions abs(...) depending on x.

However it works  using assuming x::real, but only if evalc simplifies u.
The problem is actually more serious because diff/ for Re, Im, conjugate should be revized too. Plus some other related things.

﻿