Discussion:
[fricas-devel] -0$DFLOAT ~= 0$DFLOAT causes bug in rowEchelon
Bill Page
2018-09-15 17:30:42 UTC
Permalink
Konrad Schrempf reports the following bug:

(1) -> A := matrix([[0]])$Matrix(DFLOAT)

(1) [0.0]
Type: Matrix(DoubleFloat)
(2) -> rowEchelon(A)

(2) [0.0]
Type: Matrix(DoubleFloat)
(3) -> A := matrix([[-0$DFLOAT]])

(3) [-0.0]
Type: Matrix(DoubleFloat)

(4) -> rowEchelon(A)
not invertible

(5) -> zero?(-0$DFLOAT)

(5) true
Type: Boolean
(6) -> zero?(0$DFLOAT)

(6) true
Type: Boolean
(7) -> (-0$DFLOAT ~= 0$DFLOAT)@Boolean

(7) true
--
You received this message because you are subscribed to the Google Groups "FriCAS - computer algebra system" group.
To unsubscribe from this group and stop receiving emails from it, send an email to fricas-devel+***@googlegroups.com.
To post to this group, send email to fricas-***@googlegroups.com.
Visit this group at https://groups.google.com/group/fricas-devel.
For more options, visit https://groups.google.com/d/optout.
Bill Page
2018-09-16 20:30:10 UTC
Permalink
The following patch makes equality in DFLOAT conform to the IEEE 754
standard concerning equality:

"According to the IEEE 754 standard, negative zero and positive zero
should compare as equal with the usual (numerical) comparison
operators, like the == operators of C and Java. "

https://github.com/billpage/fricas/commit/cfd3150613557acfb5a7986c6561b3ee84f09727
https://github.com/billpage/fricas/commit/cfd3150613557acfb5a7986c6561b3ee84f09727.patch
--
From cfd3150613557acfb5a7986c6561b3ee84f09727 Mon Sep 17 00:00:00 2001
From: Bill Page <***@newsynthesis.org>
Date: Sun, 16 Sep 2018 14:57:29 -0400
Subject: [PATCH] Use EQUALP for =

---
src/lisp/primitives.lisp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/lisp/primitives.lisp b/src/lisp/primitives.lisp
index 1b3017e4..7aed05df 100644
--- a/src/lisp/primitives.lisp
+++ b/src/lisp/primitives.lisp
@@ -284,7 +284,8 @@
(progn
(defmacro |less_DF| (x y) `(< (the double-float ,x)
(the double-float ,y)))
-(defmacro |eql_DF| (x y) `(EQL (the double-float ,x)
+;; use EQUALP (or maybe just = ??) to be consistent with zero?_DF
+(defmacro |eql_DF| (x y) `(EQUALP (the double-float ,x)
(the double-float ,y)))
(defmacro |expt_DF_I| (x y) `(EXPT (the double-float ,x)
(the integer ,y)))
--

This fixes the problem reported by Konrad. 'norm-out' does not find
any regressions.
Post by Bill Page
(1) -> A := matrix([[0]])$Matrix(DFLOAT)
(1) [0.0]
Type: Matrix(DoubleFloat)
(2) -> rowEchelon(A)
(2) [0.0]
Type: Matrix(DoubleFloat)
(3) -> A := matrix([[-0$DFLOAT]])
(3) [-0.0]
Type: Matrix(DoubleFloat)
(4) -> rowEchelon(A)
not invertible
(5) -> zero?(-0$DFLOAT)
(5) true
Type: Boolean
(6) -> zero?(0$DFLOAT)
(6) true
Type: Boolean
(7) true
--
You received this message because you are subscribed to the Google Groups "FriCAS - computer algebra system" group.
To unsubscribe from this group and stop receiving emails from it, send an email to fricas-devel+***@googlegroups.com.
To post to this group, send email to fricas-***@googlegroups.com.
Visit this group at https://groups.google.com/group/fricas-devel.
For more options, visit https://groups.google.com/d/optout.
Loading...