Enable more floating point exceptions

BUG=aomedia:1897

Change-Id: I7e3a2d5b1a3896e42b26d872b6468950f8746906
diff --git a/aom/src/aom_encoder.c b/aom/src/aom_encoder.c
index 523f40b..01917c9 100644
--- a/aom/src/aom_encoder.c
+++ b/aom/src/aom_encoder.c
@@ -190,7 +190,8 @@
 
 #if HAVE_FEXCEPT && CONFIG_DEBUG
 #define FLOATING_POINT_SET_EXCEPTIONS \
-  const int float_excepts = feenableexcept(FE_DIVBYZERO);
+  const int float_excepts =           \
+      feenableexcept(FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW);
 #define FLOATING_POINT_RESTORE_EXCEPTIONS feenableexcept(float_excepts);
 #else
 #define FLOATING_POINT_SET_EXCEPTIONS
diff --git a/aom_dsp/noise_util.c b/aom_dsp/noise_util.c
index 87e8e9f..7e7e380 100644
--- a/aom_dsp/noise_util.c
+++ b/aom_dsp/noise_util.c
@@ -96,7 +96,9 @@
     for (int x = 0; x < block_size; ++x) {
       int i = y * block_size + x;
       float *c = noise_tx->tx_block + 2 * i;
-      const float p = c[0] * c[0] + c[1] * c[1];
+      const float c0 = AOMMAX((float)fabs(c[0]), 1e-8f);
+      const float c1 = AOMMAX((float)fabs(c[1]), 1e-8f);
+      const float p = c0 * c0 + c1 * c1;
       if (p > kBeta * psd[i] && p > 1e-6) {
         noise_tx->tx_block[2 * i + 0] *= (p - psd[i]) / AOMMAX(p, kEps);
         noise_tx->tx_block[2 * i + 1] *= (p - psd[i]) / AOMMAX(p, kEps);
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 897daef..871ffbd 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -1526,15 +1526,17 @@
   float sum = 0.0f;
   int i;
   for (i = 0; i < 16; i++) {
-    const float v = AOMMIN(AOMMAX(scores_2D[i] + shift, 0.0f), 100.0f);
+    const float v = AOMMIN(AOMMAX(scores_2D[i] + shift, 1e-3f), 100.0f);
     const float v2 = v * v;
     const float v4 = v2 * v2;
     scores_2D[i] = v4 * v4;
     sum += scores_2D[i];
   }
   for (i = 0; i < 16; i++) {
-    if (scores_2D[i] < sum * 1e-4)
+    if (scores_2D[i] * 10000 < sum)
       scores_2D[i] = 0.0f;
+    else if (sum < 1e-16f)
+      scores_2D[i] *= 1e16f;
     else
       scores_2D[i] /= sum;
   }