@@ -970,18 +970,17 @@ MapMat_val<eT>::operator*=(const eT in_val)
970970
971971 if (it != it_end)
972972 {
973- if (in_val != eT (0 ))
974- {
975- eT& val = (*it).second ;
976-
977- val *= in_val;
978-
979- if (val == eT (0 )) { map_ref.erase (it); }
980- }
981- else
982- {
983- map_ref.erase (it);
984- }
973+ eT& val = (*it).second ;
974+
975+ val *= in_val;
976+
977+ if (val == eT (0 )) { map_ref.erase (it); }
978+ }
979+ else
980+ {
981+ const eT val = eT (0 ) * in_val; // in case in_val is inf or nan
982+
983+ if (val != eT (0 )) { parent.set_val (index, val); }
985984 }
986985 }
987986
@@ -1009,9 +1008,7 @@ MapMat_val<eT>::operator/=(const eT in_val)
10091008 }
10101009 else
10111010 {
1012- // silly operation, but included for completeness
1013-
1014- const eT val = eT (0 ) / in_val;
1011+ const eT val = eT (0 ) / in_val; // in case in_val is zero or nan
10151012
10161013 if (val != eT (0 )) { parent.set_val (index, val); }
10171014 }
@@ -1481,38 +1478,27 @@ SpMat_MapMat_val<eT>::mul(const eT in_val)
14811478
14821479 if (it != it_end)
14831480 {
1484- if (in_val != eT (0 ))
1485- {
1486- eT& val = (*it).second ;
1487-
1488- val *= in_val;
1489-
1490- if (val == eT (0 )) { map_ref.erase (it); }
1491- }
1492- else
1493- {
1494- map_ref.erase (it);
1495- }
1481+ eT& val = (*it).second ;
1482+
1483+ val *= in_val;
1484+
1485+ if (val == eT (0 )) { map_ref.erase (it); }
14961486
14971487 s_parent.sync_state = 1 ;
14981488
14991489 access::rw (s_parent.n_nonzero ) = m_parent.get_n_nonzero ();
15001490 }
15011491 else
15021492 {
1503- // element not found, ie. it's zero; zero multiplied by anything is zero, except for nan and inf
1504- if (arma_isfinite (in_val) == false )
1493+ const eT result = eT (0 ) * in_val; // in case in_val is inf or nan
1494+
1495+ if (result != eT (0 ))
15051496 {
1506- const eT result = eT (0 ) * in_val;
1497+ m_parent.set_val (index, result);
1498+
1499+ s_parent.sync_state = 1 ;
15071500
1508- if (result != eT (0 )) // paranoia, in case compiling with -ffast-math
1509- {
1510- m_parent.set_val (index, result);
1511-
1512- s_parent.sync_state = 1 ;
1513-
1514- access::rw (s_parent.n_nonzero ) = m_parent.get_n_nonzero ();
1515- }
1501+ access::rw (s_parent.n_nonzero ) = m_parent.get_n_nonzero ();
15161502 }
15171503 }
15181504 }
@@ -1554,19 +1540,15 @@ SpMat_MapMat_val<eT>::div(const eT in_val)
15541540 }
15551541 else
15561542 {
1557- // element not found, ie. it's zero; zero divided by anything is zero, except for zero and nan
1558- if ( (in_val == eT (0 )) || (arma_isnan (in_val)) )
1543+ const eT result = eT (0 ) / in_val; // in case in_val is zero or nan
1544+
1545+ if (result != eT (0 ))
15591546 {
1560- const eT result = eT (0 ) / in_val;
1547+ m_parent.set_val (index, result);
1548+
1549+ s_parent.sync_state = 1 ;
15611550
1562- if (result != eT (0 )) // paranoia, in case compiling with -ffast-math
1563- {
1564- m_parent.set_val (index, result);
1565-
1566- s_parent.sync_state = 1 ;
1567-
1568- access::rw (s_parent.n_nonzero ) = m_parent.get_n_nonzero ();
1569- }
1551+ access::rw (s_parent.n_nonzero ) = m_parent.get_n_nonzero ();
15701552 }
15711553 }
15721554 }
0 commit comments