There's two problems with your patch. There's a sign error in one of the expr which calculates the imaginary value. The second problem (in the same expr) was a * vs / error ( you put "/ 2*$f1" instead of / 2 / $f1). Does that make a difference?
Anyway, I jiggled with it enough to get it right. Also, I put two other expr that check to make sure the poles / zeros are in fact complex rather than real.
Wait a minute.... how about just making some long expr that will sort it out correctly and supply the zeros and poles for the real case as well. I'll add that too.
Chuck p.s. I had some trouble following your expr syntax. It makes me wonder if there's something I don't know about expr?