From: Tino Calancha <tino.calancha@gmail.com>
To: 25652@debbugs.gnu.org
Subject: bug#25652: 26.0.50; calc says that cos(1 degree) is 0.54
Date: Mon, 13 Feb 2017 12:40:05 +0900 (JST) [thread overview]
Message-ID: <alpine.DEB.2.20.1702131238100.2278@calancha-pc> (raw)
In-Reply-To: <877f51f7ze.fsf@wilson>
[Forwading to the bug thread: Sorry if you receive this message twice]
npostavs@users.sourceforge.net writes:
> tags 25652 confirmed
> retitle 25652 26.0.50; [calc] In Units Simplication + Degree mode cos(1 deg) != cos(1)
> quit
>
> Torsten Bronger <bronger@physik.rwth-aachen.de> writes:
>>> You can toggle this in calc mode with "m U". So "m d m U 1 C m U
>>> 1 C" should exhibit the problem. Note that you have "Deg" active
>>> the whole time. [...]
>>
>> After havin updated to current git master, I can now reproduce this
>> on both of my machine. Can you confirm?
>
> Yes, this happens in units simplication mode. Note that 'cos(1 deg) RET
> does give 0.999. It seems to be because of the fix for #23889 [1:
> 713e922243]. Tino, any ideas?
>
> 1: 2016-07-12 00:38:14 +0900 713e922243fb60d850f7b0ff83f3e2a3682f1832
> Ignore angle mode while simplifying units
Yes, my commit produced this bug. We must revert it. Sorry for that.
That commit was to fix Bug#23889. It would be nice if we can fix Bug#23889 in
a new way.
In that bug the problem was that, if the user inputs a symbolic expression containning
an angle unit, then this unit is overriden by calc-angle-mode while simplifying such
expression.
That should not happen as mentioned in the manual:
(info "(calc) Trigonometric and Hyperbolic Functions")
That is,
M-x calc RET
m d ; Set calc-angle-mode to degrees.
' sin (45 deg) RET
u s ; Must insert the value of: (sin (* 45 pi (/ 180.0)))
;; But instead, inserts the value of: (sin (* 45 (expt (/ pi 180.0) 2)))
;; i.e., it's applying (/ pi 180) twice.
I have updated the patch:
1) Revert 713e922243
2) Bind calc-angle-mode to 'rad while simplifying an expression whenever such
expression contains an unit angle. This way, hopefully, the second factor (/ pi 180)
won't be applied.
Opinions, comments...
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
From 1a2592409c0fcfca7826b71248d3d3d234355c13 Mon Sep 17 00:00:00 2001
From: Tino Calancha <tino.calancha@gmail.com>
Date: Sun, 12 Feb 2017 21:14:34 +0900
Subject: [PATCH 1/2] Revert 'Ignore angle mode while simplifying units'
This commit (713e922243) cause regressions (Bug#25652).
---
lisp/calc/calc-forms.el | 12 +++---------
lisp/calc/calc-math.el | 12 ++++--------
2 files changed, 7 insertions(+), 17 deletions(-)
diff --git a/lisp/calc/calc-forms.el b/lisp/calc/calc-forms.el
index 6aa421ec20..abf76cf07e 100644
--- a/lisp/calc/calc-forms.el
+++ b/lisp/calc/calc-forms.el
@@ -317,9 +317,7 @@ math-to-hms
(list 'calcFunc-hms a))
((math-negp a)
(math-neg (math-to-hms (math-neg a) ang)))
- ((eq (or ang
- (and (not math-simplifying-units) calc-angle-mode))
- 'rad)
+ ((eq (or ang calc-angle-mode) 'rad)
(math-to-hms (math-div a (math-pi-over-180)) 'deg))
((memq (car-safe a) '(cplx polar)) a)
(t
@@ -356,16 +354,12 @@ math-from-hms
(if (eq (car-safe a) 'sdev)
(math-make-sdev (math-from-hms (nth 1 a) ang)
(math-from-hms (nth 2 a) ang))
- (if (eq (or ang
- (and (not math-simplifying-units) calc-angle-mode))
- 'rad)
+ (if (eq (or ang calc-angle-mode) 'rad)
(list 'calcFunc-rad a)
(list 'calcFunc-deg a)))))
((math-negp a)
(math-neg (math-from-hms (math-neg a) ang)))
- ((eq (or ang
- (and (not math-simplifying-units) calc-angle-mode))
- 'rad)
+ ((eq (or ang calc-angle-mode) 'rad)
(math-mul (math-from-hms a 'deg) (math-pi-over-180)))
(t
(math-add (math-div (math-add (math-div (nth 3 a)
diff --git a/lisp/calc/calc-math.el b/lisp/calc/calc-math.el
index 2590761d53..faa318d45d 100644
--- a/lisp/calc/calc-math.el
+++ b/lisp/calc/calc-math.el
@@ -763,14 +763,12 @@ calcFunc-nroot
(defun math-to-radians (a) ; [N N]
(cond ((eq (car-safe a) 'hms)
(math-from-hms a 'rad))
- ((and (not math-simplifying-units)
- (memq calc-angle-mode '(deg hms)))
+ ((memq calc-angle-mode '(deg hms))
(math-mul a (math-pi-over-180)))
(t a)))
(defun math-from-radians (a) ; [N N]
- (cond ((and (not math-simplifying-units)
- (eq calc-angle-mode 'deg))
+ (cond ((eq calc-angle-mode 'deg)
(if (math-constp a)
(math-div a (math-pi-over-180))
(list 'calcFunc-deg a)))
@@ -781,16 +779,14 @@ math-from-radians
(defun math-to-radians-2 (a &optional force-symbolic) ; [N N]
(cond ((eq (car-safe a) 'hms)
(math-from-hms a 'rad))
- ((and (not math-simplifying-units)
- (memq calc-angle-mode '(deg hms)))
+ ((memq calc-angle-mode '(deg hms))
(if (or calc-symbolic-mode force-symbolic)
(math-div (math-mul a '(var pi var-pi)) 180)
(math-mul a (math-pi-over-180))))
(t a)))
(defun math-from-radians-2 (a &optional force-symbolic) ; [N N]
- (cond ((and (not math-simplifying-units)
- (memq calc-angle-mode '(deg hms)))
+ (cond ((memq calc-angle-mode '(deg hms))
(if (or calc-symbolic-mode force-symbolic)
(math-div (math-mul 180 a) '(var pi var-pi))
(math-div a (math-pi-over-180))))
--
2.11.0
From b1b6f62f5baa8023a7b5d45b1d30399c8e8f82a2 Mon Sep 17 00:00:00 2001
From: Tino Calancha <tino.calancha@gmail.com>
Date: Sun, 12 Feb 2017 21:45:47 +0900
Subject: [PATCH 2/2] Prevent from override input angle unit while simplifying
Ignore calc-angle-mode while simplifying if the expression
contains angle units (Bug#23899).
* lisp/calc/calc-alg.el (calc-input-angle-units): New defun.
(math-simplify): If TOP-EXPR contains angle units, then bind
calc-angle-mode to 'rad.
* test/lisp/calc/calc-tests.el (test-calc-23889): New test.
---
lisp/calc/calc-alg.el | 9 +++++++++
test/lisp/calc/calc-tests.el | 46 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 55 insertions(+)
diff --git a/lisp/calc/calc-alg.el b/lisp/calc/calc-alg.el
index 4e63d238c7..9db901a975 100644
--- a/lisp/calc/calc-alg.el
+++ b/lisp/calc/calc-alg.el
@@ -355,10 +355,19 @@ math-hyperbolic-trig-rewrite
;; math-simplify-step, which is called by math-simplify.
(defvar math-top-only)
+(defun calc-input-angle-units (input)
+ (cond ((math-expr-contains input '(var deg var-deg)) 'deg)
+ ((math-expr-contains input '(var rad var-rad)) 'rad)
+ ((math-expr-contains input '(var hms var-hms)) 'hms)
+ (t nil)))
+
;; math-normalize-error is declared in calc.el.
(defvar math-normalize-error)
(defun math-simplify (top-expr)
(let ((math-simplifying t)
+ (calc-angle-mode (if (calc-input-angle-units top-expr)
+ 'rad
+ calc-angle-mode))
(math-top-only (consp calc-simplify-mode))
(simp-rules (append (and (calc-has-rules 'var-AlgSimpRules)
'((var AlgSimpRules var-AlgSimpRules)))
diff --git a/test/lisp/calc/calc-tests.el b/test/lisp/calc/calc-tests.el
index 8f56d48d01..45b735c3c6 100644
--- a/test/lisp/calc/calc-tests.el
+++ b/test/lisp/calc/calc-tests.el
@@ -86,6 +86,52 @@ calc-tests-simple
(math-read-expr "1m") "cm")
'(* -100 (var cm var-cm)))))
+(ert-deftest test-calc-23889 ()
+ "Test for http://debbugs.gnu.org/23889 and 25652."
+ (dolist (mode '(deg rad))
+ (let ((calc-angle-mode mode))
+ ;; If user inputs angle units, then should ignore `calc-angle-mode'.
+ (should (string= "5253"
+ (substring
+ (number-to-string
+ (nth 1
+ (math-simplify-units
+ '(calcFunc-cos (* 45 (var rad var-rad))))))
+ 0 4)))
+ (should (string= "7071"
+ (substring
+ (number-to-string
+ (nth 1
+ (math-simplify-units
+ '(calcFunc-cos (* 45 (var deg var-deg))))))
+ 0 4)))
+ (should (string= "8939"
+ (substring
+ (number-to-string
+ (nth 1
+ (math-simplify-units
+ '(+ (calcFunc-sin (* 90 (var rad var-rad)))
+ (calcFunc-cos (* 90 (var deg var-deg)))))))
+ 0 4)))
+ (should (string= "5519"
+ (substring
+ (number-to-string
+ (nth 1
+ (math-simplify-units
+ '(+ (calcFunc-sin (* 90 (var deg var-deg)))
+ (calcFunc-cos (* 90 (var rad var-rad)))))))
+ 0 4)))
+ ;; If user doesn't input units, then must use `calc-angle-mode'.
+ (should (string= (if (eq calc-angle-mode 'deg)
+ "9998"
+ "5403")
+ (substring
+ (number-to-string
+ (nth 1
+ (math-simplify-units
+ '(calcFunc-cos 1))))
+ 0 4))))))
+
(provide 'calc-tests)
;;; calc-tests.el ends here
--
2.11.0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
In GNU Emacs 26.0.50.1 (x86_64-pc-linux-gnu, GTK+ Version 3.22.7)
of 2017-02-12
Repository revision: 862d6438cfa6c6c035033697751f3d002357b024
next prev parent reply other threads:[~2017-02-13 3:40 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-08 7:37 bug#25652: 26.0.50; calc says that cos(1 degree) is 0.54 Torsten Bronger
2017-02-08 17:39 ` Eli Zaretskii
2017-02-08 18:52 ` Torsten Bronger
2017-02-08 19:31 ` Óscar Fuentes
2017-02-08 19:36 ` Noam Postavsky
2017-02-09 9:08 ` Torsten Bronger
2017-02-09 14:06 ` npostavs
2017-02-09 18:09 ` Glenn Morris
2017-02-10 6:17 ` Torsten Bronger
2017-02-10 7:59 ` Torsten Bronger
2017-02-11 10:16 ` Torsten Bronger
2017-02-11 14:14 ` npostavs
2017-02-13 3:40 ` Tino Calancha [this message]
2017-05-18 3:32 ` npostavs
2017-05-18 5:51 ` Tino Calancha
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.DEB.2.20.1702131238100.2278@calancha-pc \
--to=tino.calancha@gmail.com \
--cc=25652@debbugs.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).