




sx, has length n. This first version, adapted from the original FORTRAN, raises the invalid flag when any element of the vector is a NaN. When the vector has no numerical elements, it returns  .
.
 
  int ISAMax (int n, const float *sx) {
      int ixmax = -1; // if n <= 0, return -1
      float_t sxmax = -1.0;
   
      if (n > 0)
          for (int i = 0; i < n; i++, sx++)
              if (Abs(*sx) > sxmax) {
                  ixmax = i;
                  sxmax = Abs(*sx);
              }
      return ixmax;
  }
(Abs(*sx) > sxmax) raises the invalid flag, according to the IEEE floating-point standards. That might not be what you want. A variation of the test in the inner loop uses IsGreater, which is equivalent to > but raises no flag. (This is similar in style to the library function Max in that it unexceptionally finds the largest number.)
  if (IsGreater(Abs(*sx), sxmax)) {
      ixmax = i;
      sxmax = Abs(*sx);
  }
  for (int i = 0; i < n; i++, sx++)
      if (!IsLessEqual(Abs(*sx), sxmax) {
          ixmax = i;
          if (IsNaN(*sx)) // exit if NaN
              break;
          sxmax = Abs(*sx);
      }
!IsLessEqual to effect the test "is greater than or unordered with" without raising the invalid flag.
 Click the icon to mail questions or corrections about this material to Taligent personnel.
Click the icon to mail questions or corrections about this material to Taligent personnel.