(root)/
glibc-2.38/
stdlib/
tst-tininess.c
       1  /* Test that tininess.h is correct for this architecture.
       2     Copyright (C) 2012-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <fenv.h>
      20  #include <float.h>
      21  #include <stdio.h>
      22  #include <tininess.h>
      23  
      24  volatile float a = 0x1.fffp-126;
      25  volatile float b = 0x1.0008p-1;
      26  volatile float c;
      27  volatile float m = FLT_MIN;
      28  volatile float mm;
      29  
      30  static int
      31  do_test (void)
      32  {
      33    int result = 0;
      34  #ifdef FE_UNDERFLOW
      35    feclearexcept (FE_ALL_EXCEPT);
      36    mm = m * m;
      37    if (!fetestexcept (FE_UNDERFLOW))
      38      {
      39        puts ("underflow exception not supported at runtime, cannot test");
      40        return 0;
      41      }
      42    feclearexcept (FE_ALL_EXCEPT);
      43    c = a * b;
      44    if (fetestexcept (FE_UNDERFLOW))
      45      {
      46        if (TININESS_AFTER_ROUNDING)
      47  	{
      48  	  puts ("tininess.h says after rounding, "
      49  		"but detected before rounding");
      50  	  result = 1;
      51  	}
      52      }
      53    else
      54      {
      55        if (!TININESS_AFTER_ROUNDING)
      56  	{
      57  	  puts ("tininess.h says before rounding, "
      58  		"but detected after rounding");
      59  	  result = 1;
      60  	}
      61      }
      62  #else
      63    puts ("underflow exception not supported at compile time, cannot test");
      64  #endif
      65    return result;
      66  }
      67  
      68  #define TEST_FUNCTION do_test ()
      69  #include "../test-skeleton.c"