NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: lib/46433: tests/lib/libm/t_exp should not use exp() itself



The following reply was made to PR lib/46433; it has been noted by GNATS.

From: Tetsuya Isaki <isaki%pastel-flower.jp@localhost>
To: gnats-bugs%NetBSD.org@localhost, jruohonen%iki.fi@localhost
Cc: lib-bug-people%netbsd.org@localhost,
        gnats-admin%netbsd.org@localhost,
        netbsd-bugs%netbsd.org@localhost
Subject: Re: lib/46433: tests/lib/libm/t_exp should not use exp() itself
Date: Wed, 30 May 2012 23:15:28 +0900

 At Tue, 29 May 2012 11:50:04 +0000 (UTC),
 Jukka Ruohonen wrote:
 >  That is one option sure. But if there is no immedate fix available, we
 >  likely want to count these cases as expected failures. So I think we can put
 >  something like the following to the beginning of these cases:
 >  
 >      if (exp(1.0) == 0.0) {
 >              atf_tc_expect_fail("PR lib/46433");
 >              atf_tc_fail("exp(1.0) = 0.0");
 >      }
 >  
 >      [start the actual test]
 
 How about this?  (At first I rewrote about exp()/expf()
 because I don't know about exp2()/exp2f() well...)
 However, I'm not sure about its appropriate range and
 appropriate epsilon.
 
 Index: t_exp.c
 ===================================================================
 RCS file: /cvsroot/src/tests/lib/libm/t_exp.c,v
 retrieving revision 1.1
 diff -u -r1.1 t_exp.c
 --- t_exp.c    18 Sep 2011 05:19:18 -0000      1.1
 +++ t_exp.c    30 May 2012 14:09:56 -0000
 @@ -32,6 +32,22 @@
  #include <atf-c.h>
  #include <math.h>
  
 +/* y = exp(x) */
 +static const struct {
 +      double x;
 +      double y;
 +} exp_values[] = {
 +      {  -10, 0.4539992976248485e-4, },
 +      {   -5, 0.6737946999085467e-2, },
 +      {   -1, 0.3678794411714423, },
 +      { -0.1, 0.9048374180359595, },
 +      {    0, 1.0000000000000000, },
 +      {  0.1, 1.1051709180756477, },
 +      {    1, 2.7182818284590452, },
 +      {    5, 148.41315910257660, },
 +      {   10, 22026.465794806718, },
 +};
 +
  /*
   * exp2(3)
   */
 @@ -305,22 +321,23 @@
  ATF_TC(exp_product);
  ATF_TC_HEAD(exp_product, tc)
  {
 -      atf_tc_set_md_var(tc, "descr", "Test exp(x + y) == exp(x) * exp(y)");
 +      atf_tc_set_md_var(tc, "descr", "Test some selected exp(x)");
  }
  
  ATF_TC_BODY(exp_product, tc)
  {
  #ifndef __vax__
 -      const double x[] = { 0.0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8 };
 -      const double y[] = { 8.8, 7.7, 6.6, 5.5, 4.4, 3.3, 2.2, 1.1, 0.0 };
 +      double x;
 +      double y;
        const double eps = 1.0e-11;
        size_t i;
  
 -      for (i = 0; i < __arraycount(x); i++) {
 +      for (i = 0; i < __arraycount(exp_values); i++) {
 +              x = exp_values[i].x;
 +              y = exp_values[i].y;
  
 -              if (fabs(exp(x[i] + y[i]) - (exp(x[i]) * exp(y[i]))) > eps)
 -                      atf_tc_fail_nonfatal("exp(%0.01f + %0.01f) != exp("
 -                          "%0.01f) * exp(%0.01f)", x[i], y[i], x[i], y[i]);
 +              if (fabs(exp(x) - y) > eps)
 +                      atf_tc_fail_nonfatal("exp(%0.01f) != %18.18e", x, y);
        }
  #endif
  }
 @@ -413,22 +430,23 @@
  ATF_TC(expf_product);
  ATF_TC_HEAD(expf_product, tc)
  {
 -      atf_tc_set_md_var(tc, "descr", "Test expf(x+y) == expf(x) * expf(y)");
 +      atf_tc_set_md_var(tc, "descr", "Test some selected expf(x)");
  }
  
  ATF_TC_BODY(expf_product, tc)
  {
  #ifndef __vax__
 -      const float x[] = { 0.0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8 };
 -      const float y[] = { 8.8, 7.7, 6.6, 5.5, 4.4, 3.3, 2.2, 1.1, 0.0 };
 +      float x;
 +      float y;
        const float eps = 1.0e-2;
        size_t i;
  
 -      for (i = 0; i < __arraycount(x); i++) {
 +      for (i = 0; i < __arraycount(exp_values); i++) {
 +              x = exp_values[i].x;
 +              y = exp_values[i].y;
  
 -              if (fabsf(expf(x[i] + y[i]) - (expf(x[i]) * expf(y[i]))) > eps)
 -                      atf_tc_fail_nonfatal("expf(%0.01f + %0.01f) != expf("
 -                          "%0.01f) * expf(%0.01f)", x[i], y[i], x[i], y[i]);
 +              if (fabsf(expf(x) - y) > eps)
 +                      atf_tc_fail_nonfatal("expf(%0.01f) != %18.18e", x, y);
        }
  #endif
  }
 
 ---
 Tetsuya Isaki <isaki%pastel-flower.jp@localhost / isaki%NetBSD.org@localhost>
 


Home | Main Index | Thread Index | Old Index