changeset 31305:3b16c2d90326 stable

var.m: Ensure consistent NaN outputs for Inf and NaN inputs (bug #63203) * var.m: Add Inf and NaN input check to the shortcut codepath when the operating dimension length is 1, and ensure a NaN output instead of 0. Add BISTs to verify compatible outputs for NaN and Inf. * NEWS.7.md: Note bugfix under Improvements and fixes.
author Nicholas R. Jankowski <jankowski.nicholas@gmail.com>
date Sat, 15 Oct 2022 08:27:57 -0400
parents cfc3a72fa5cb
children ef3cd4d7691f e649aa69d5bc
files etc/NEWS.7.md scripts/statistics/var.m
diffstat 2 files changed, 30 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/etc/NEWS.7.md	Fri Oct 14 13:06:24 2022 -0400
+++ b/etc/NEWS.7.md	Sat Oct 15 08:27:57 2022 -0400
@@ -22,6 +22,7 @@
 - Accept negative inputs to -2^63 for `dec2bin` and `dec2hex` (bug #63089).
 - Fix incorrect `lambda` outputs for `lsqnonneg` and `pqpnonneg` (bug #63178).
 - `addtodate.m`: Fix wrong month returned when subtracting a month from some end-of-month dates (bug #60671).
+- `var.m`: Fix some Inf and NaN inputs returning 0 instead of NaN (bug #63203)
 
 ### GUI
 
--- a/scripts/statistics/var.m	Fri Oct 14 13:06:24 2022 -0400
+++ b/scripts/statistics/var.m	Sat Oct 15 08:27:57 2022 -0400
@@ -197,6 +197,7 @@
         else
           retval = zeros (sz);
         endif
+          retval(isnan (x) | isinf (x)) = NaN;
       endif
     else
       if (isscalar (w))
@@ -259,6 +260,34 @@
 %!assert (var (ones (1,3,0,2), [], 3), NaN(1,3,1,2))
 %!assert (var (ones (1,3,0,2), [], 4), NaN(1,3,0))
 
+## Test Inf and NaN inputs
+%!assert <*63203> (var (Inf), NaN)
+%!assert <*63203> (var (NaN), NaN)
+%!assert <*63203> (var ([1, Inf, 3]), NaN)
+%!assert <*63203> (var ([1, Inf, 3]'), NaN)
+%!assert <*63203> (var ([1, NaN, 3]), NaN)
+%!assert <*63203> (var ([1, NaN, 3]'), NaN)
+%!assert <*63203> (var ([1, Inf, 3], [], 1), [0, NaN, 0])
+%!assert <*63203> (var ([1, Inf, 3], [], 2), NaN)
+%!assert <*63203> (var ([1, Inf, 3], [], 3), [0, NaN, 0])
+%!assert <*63203> (var ([1, NaN, 3], [], 1), [0, NaN, 0])
+%!assert <*63203> (var ([1, NaN, 3], [], 2), NaN)
+%!assert <*63203> (var ([1, NaN, 3], [], 3), [0, NaN, 0])
+%!assert <*63203> (var ([1, 2, 3; 3, Inf, 5]), [2, NaN, 2])
+%!assert <*63203> (var ([1, Inf, 3; 3, Inf, 5]), [2, NaN, 2])
+%!assert <*63203> (var ([1, 2, 3; 3, NaN, 5]), [2, NaN, 2])
+%!assert <*63203> (var ([1, NaN, 3; 3, NaN, 5]), [2, NaN, 2])
+%!assert <*63203> (var ([Inf, 2, NaN]), NaN)
+%!assert <*63203> (var ([Inf, 2, NaN]'), NaN)
+%!assert <*63203> (var ([NaN, 2, Inf]), NaN)
+%!assert <*63203> (var ([NaN, 2, Inf]'), NaN)
+%!assert <*63203> (var ([Inf, 2, NaN], [], 1), [NaN, 0, NaN])
+%!assert <*63203> (var ([Inf, 2, NaN], [], 2), NaN)
+%!assert <*63203> (var ([NaN, 2, Inf], [], 1), [NaN, 0, NaN])
+%!assert <*63203> (var ([NaN, 2, Inf], [], 2), NaN)
+%!assert <*63203> (var ([1, 3, NaN; 3, 5, Inf]), [2, 2, NaN])
+%!assert <*63203> (var ([1, 3, Inf; 3, 5, NaN]), [2, 2, NaN]);
+
 ## Test input validation
 %!error <Invalid call> var ()
 %!error <X must be a numeric> var (['A'; 'B'])