Hi Robert,
Robert Smith quad@symbo1ics.com writes:
On Wed, Apr 25, 2012 at 12:30 AM, Tamas K Papp tkpapp@gmail.com wrote:
I don't really see the value of aliases for PLUSP and MINUSP, and I have some doubts about NON-ZERO-P too.
Not unreasonable.
All of these show up in a lot of mathematical code I (and coworkers) write. I only argue for POSITIVEP, etc., because that is an extremely common term. If we need to make it more substantial than just aliasing PLUSP, then we can let POSITIVEP also return T for +0.0, similarly for NEGATIVEP and -0.0. I don't really like that, but at least it has utility.
CL already has FLOAT-SIGN.
Having its own function is also useful for functional operations, like filtering. Real-world example: finding non-zero values in the diagonal of one of the matrices in a singular value decomposition and finding those indexes in the other factor lets us find the basis of the kernel/null space of the matrix.
First, I would never want test for something being (non)zero in those cases (because of numerical error). I would test with something like
(let ((tolerance (expt epsilon (/ n)))) (lambda (x) (<= (abs x) tolerance)))
where epsilon corresponds to the float type, and n is 2 or 3, depending on the application. This is what is usually done in code that calculates rank numerically.
Second, if you need a function, you can use (COMPLEMENT #'ZEROP).
Quite simply, I'd say, the concept of non-zeroness as an almost atomic notion is pervasive in especially mathematics, which Lisp happens to be good at.
Sure, but you have to be careful when mapping abstract concepts to floating point calculations.
Best,
Tamas