diff liboctave/array/Range.cc @ 18897:c457a84bc7d3 stable

improve accuracy of range/scalar arithmetic (bug #42589) * Range.h, Range.cc (Range::Range (double, double, double, octave_idx_type): New protected constructor. (operator -, operator +, operator *): Use new constructor. (Range::Range (double, double, octave_idx_type): Also check that the limit remains finite.
author John W. Eaton <jwe@octave.org>
date Fri, 20 Jun 2014 18:55:38 -0400
parents 49a5a4be04a1
children 4197fc428c7d
line wrap: on
line diff
--- a/liboctave/array/Range.cc	Wed Jun 25 17:17:38 2014 -0400
+++ b/liboctave/array/Range.cc	Fri Jun 20 18:55:38 2014 -0400
@@ -387,12 +387,12 @@
 Range
 operator - (const Range& r)
 {
-  return Range (-r.base (), -r.inc (), r.nelem ());
+  return Range (-r.base (), -r.limit (), -r.inc (), r.nelem ());
 }
 
 Range operator + (double x, const Range& r)
 {
-  Range result (x + r.base (), r.inc (), r.nelem ());
+  Range result (x + r.base (), x + r.limit (), r.inc (), r.nelem ());
   if (result.rng_nelem < 0)
     result.cache = x + r.matrix_value ();
 
@@ -401,7 +401,7 @@
 
 Range operator + (const Range& r, double x)
 {
-  Range result (r.base () + x, r.inc (), r.nelem ());
+  Range result (r.base () + x, r.limit () + x, r.inc (), r.nelem ());
   if (result.rng_nelem < 0)
     result.cache = r.matrix_value () + x;
 
@@ -410,7 +410,7 @@
 
 Range operator - (double x, const Range& r)
 {
-  Range result (x - r.base (), -r.inc (), r.nelem ());
+  Range result (x - r.base (), x - r.limit (), -r.inc (), r.nelem ());
   if (result.rng_nelem < 0)
     result.cache = x - r.matrix_value ();
 
@@ -419,7 +419,7 @@
 
 Range operator - (const Range& r, double x)
 {
-  Range result (r.base () - x, r.inc (), r.nelem ());
+  Range result (r.base () - x, r.limit () - x, r.inc (), r.nelem ());
   if (result.rng_nelem < 0)
     result.cache = r.matrix_value () - x;
 
@@ -428,7 +428,7 @@
 
 Range operator * (double x, const Range& r)
 {
-  Range result (x * r.base (), x * r.inc (), r.nelem ());
+  Range result (x * r.base (), x * r.limit (), x * r.inc (), r.nelem ());
   if (result.rng_nelem < 0)
     result.cache = x * r.matrix_value ();
 
@@ -437,7 +437,7 @@
 
 Range operator * (const Range& r, double x)
 {
-  Range result (r.base () * x, r.inc () * x, r.nelem ());
+  Range result (r.base () * x, r.limit () * x, r.inc () * x, r.nelem ());
   if (result.rng_nelem < 0)
     result.cache = r.matrix_value () * x;