changeset 29167:9193e7c990ea

sind.m, sinpi.m, cospi.m: Wrap to interval closer to zero for higher accuracy. * scripts/elfun/sind.m, scripts/elfun/sinpi.m, scripts/elfun/cospi.m: Wrap input to interval [-pi,pi) for higher numeric accuracy.
author Markus Mützel <markus.muetzel@gmx.de>
date Wed, 09 Dec 2020 20:04:59 +0100
parents fbf6d132dec7
children 8a2449d40f3c
files scripts/elfun/cospi.m scripts/elfun/sind.m scripts/elfun/sinpi.m
diffstat 3 files changed, 9 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/elfun/cospi.m	Wed Dec 09 19:25:01 2020 +0100
+++ b/scripts/elfun/cospi.m	Wed Dec 09 20:04:59 2020 +0100
@@ -58,11 +58,11 @@
   endif
 
   ## Advance phase by pi/2 so that algorithm from sinpi can be used.
-  ## Unwrap integer multiples so that new domain is [0, 2).
-  x = mod (x + 0.5, 2);
+  ## Wrap integer multiples so that new domain is [-1, 1).
+  x = mod (x - 0.5, 2) - 1;
 
   ## Integer multiples of pi must be exactly zero.
-  x(x == 1) = 0;
+  x(x == -1) = 0;
 
   y = sin (x * pi);
 
--- a/scripts/elfun/sind.m	Wed Dec 09 19:25:01 2020 +0100
+++ b/scripts/elfun/sind.m	Wed Dec 09 20:04:59 2020 +0100
@@ -38,11 +38,11 @@
     print_usage ();
   endif
 
-  ## Unwrap multiples so that new domain is [0, 360)
-  x = mod (x, 360);
+  ## Wrap multiples so that new domain is [-180, 180)
+  x = mod (x-180, 360) - 180;
 
   ## Integer multiples of pi must be exactly zero
-  x(x == 180) = 0;
+  x(x == -180) = 0;
 
   y = sin (x / 180 * pi);
 
--- a/scripts/elfun/sinpi.m	Wed Dec 09 19:25:01 2020 +0100
+++ b/scripts/elfun/sinpi.m	Wed Dec 09 20:04:59 2020 +0100
@@ -57,11 +57,11 @@
     print_usage ();
   endif
 
-  ## Unwrap integer multiples so that new domain is [0, 2)
-  x = mod (x, 2);
+  ## Wrap integer multiples so that new domain is [-1, 1)
+  x = mod (x-1, 2) - 1;
 
   ## Integer multiples of pi must be exactly zero
-  x(x == 1) = 0;
+  x(x == -1) = 0;
 
   y = sin (x * pi);