text: /*
   *                               POK header
   *
   * The following file is a part of the POK project. Any modification should
   * be made according to the POK licence. You CANNOT use this file or a part
   * of a file for your own project.
   *
   * For more information on the POK licence, please see our LICENCE FILE
   *
   * Please follow the coding guidelines described in doc/CODING_GUIDELINES
   *
   *                                      Copyright (c) 2007-2021 POK team
   */
  
  /* @(#)s_floor.c 5.1 93/09/24 */
  /*
   * ====================================================
   * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
   *
   * Developed at SunPro, a Sun Microsystems, Inc. business.
   * Permission to use, copy, modify, and distribute this
   * software is freely granted, provided that this notice
   * is preserved.
   * ====================================================
   */
  
  #ifdef POK_NEEDS_LIBMATH
  
  /*
   * truncf(x)
   * Return x rounded toward 0 to integral value
   * Method:
   *	Bit twiddling.
   * Exception:
   *	Inexact flag raised if x not equal to truncf(x).
   */
  
  #include "math_private.h"
  #include <libm.h>
  
  static const float huge = 1.0e30F;
  
  float truncf(float x) {
    int32_t i0, jj0;
    uint32_t i;
    GET_FLOAT_WORD(i0, x);
    jj0 = ((i0 >> 23) & 0xff) - 0x7f;
    if (jj0 < 23) {
      if (jj0 < 0) {         /* raise inexact if x != 0 */
        if (huge + x > 0.0F) /* |x|<1, so return 0*sign(x) */
          i0 &= 0x80000000;
      } else {
        i = (0x007fffff) >> jj0;
        if ((i0 & i) == 0)
          return x;          /* x is integral */
        if (huge + x > 0.0F) /* raise inexact flag */
          i0 &= (~i);
      }
    } else {
      if (jj0 == 0x80)
        return x + x; /* inf or NaN */
      else
        return x; /* x is integral */
    }
    SET_FLOAT_WORD(x, i0);
    return x;
  }
  
  #endif
  