Subversion Repositories Kolibri OS

Rev

Rev 4872 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4349 Serge 1
/*
2
 * ====================================================
3
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
4
 *
5
 * Developed at SunPro, a Sun Microsystems, Inc. business.
6
 * Permission to use, copy, modify, and distribute this
7
 * software is freely granted, provided that this notice
8
 * is preserved.
9
 * ====================================================
10
 */
11
/*
12
FUNCTION
13
<>, <>--round to integer, towards zero
14
INDEX
15
	trunc
16
INDEX
17
	truncf
18
 
19
ANSI_SYNOPSIS
20
	#include 
21
	double trunc(double <[x]>);
22
	float truncf(float <[x]>);
23
 
24
DESCRIPTION
25
	The <> functions round their argument to the integer value, in
26
	floating format, nearest to but no larger in magnitude than the
27
	argument, regardless of the current rounding direction.  (While the
28
	"inexact" floating-point exception behavior is unspecified by the C
29
	standard, the <> functions are written so that "inexact" is not
30
	raised if the result does not equal the argument, which behavior is as
31
	recommended by IEEE 754 for its related functions.)
32
 
33
RETURNS
34
<[x]> truncated to an integral value.
35
 
36
PORTABILITY
37
ANSI C, POSIX
38
 
39
*/
40
 
41
#include "fdlibm.h"
42
 
43
#ifndef _DOUBLE_IS_32BITS
44
 
45
#ifdef __STDC__
46
	double trunc(double x)
47
#else
48
	double trunc(x)
49
	double x;
50
#endif
51
{
52
  int signbit;
53
  /* Most significant word, least significant word. */
54
  int msw;
55
  unsigned int lsw;
56
  int exponent_less_1023;
57
 
58
  EXTRACT_WORDS(msw, lsw, x);
59
 
60
  /* Extract sign bit. */
61
  signbit = msw & 0x80000000;
62
 
63
  /* Extract exponent field. */
64
  exponent_less_1023 = ((msw & 0x7ff00000) >> 20) - 1023;
65
 
66
  if (exponent_less_1023 < 20)
67
    {
68
      /* All significant digits are in msw. */
69
      if (exponent_less_1023 < 0)
70
        {
71
          /* -1 < x < 1, so result is +0 or -0. */
72
          INSERT_WORDS(x, signbit, 0);
73
        }
74
      else
75
        {
76
          /* All relevant fraction bits are in msw, so lsw of the result is 0. */
77
          INSERT_WORDS(x, signbit | (msw & ~(0x000fffff >> exponent_less_1023)), 0);
78
        }
79
    }
80
  else if (exponent_less_1023 > 51)
81
    {
82
      if (exponent_less_1023 == 1024)
83
        {
84
          /* x is infinite, or not a number, so trigger an exception. */
85
          return x + x;
86
        }
87
      /* All bits in the fraction fields of the msw and lsw are needed in the result. */
88
    }
89
  else
90
    {
91
      /* All fraction bits in msw are relevant.  Truncate irrelevant
92
         bits from lsw. */
93
      INSERT_WORDS(x, msw, lsw & ~(0xffffffffu >> (exponent_less_1023 - 20)));
94
    }
95
  return x;
96
}
97
 
98
#endif /* _DOUBLE_IS_32BITS */