fenv.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:13k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /*
  2.      File:       fenv.h
  3.  
  4.      Contains:   Floating-Point environment for PowerPC and 68K
  5.  
  6.      Version:    Technology: MathLib v2
  7.                  Release:    QuickTime 6.0.2
  8.  
  9.      Copyright:  (c) 1987-2001 by Apple Computer, Inc., all rights reserved.
  10.  
  11.      Bugs?:      For bug reports, consult the following page on
  12.                  the World Wide Web:
  13.  
  14.                      http://developer.apple.com/bugreporter/
  15.  
  16. */
  17. #ifndef __FENV__
  18. #define __FENV__
  19. #ifndef __CONDITIONALMACROS__
  20. #include "ConditionalMacros.h"
  21. #endif
  22. #if PRAGMA_ONCE
  23. #pragma once
  24. #endif
  25. #ifdef __cplusplus
  26. extern "C" {
  27. #endif
  28. #if PRAGMA_IMPORT
  29. #pragma import on
  30. #endif
  31. #if PRAGMA_STRUCT_ALIGN
  32.     #pragma options align=mac68k
  33. #elif PRAGMA_STRUCT_PACKPUSH
  34.     #pragma pack(push, 2)
  35. #elif PRAGMA_STRUCT_PACK
  36.     #pragma pack(2)
  37. #endif
  38. #if TARGET_OS_MAC
  39. /*
  40.     A collection of functions designed to provide access to the floating
  41.     point environment for numerical programming. It is modeled after
  42.     the floating-point requirements in C9X.
  43.     
  44.     The file <fenv.h> declares many functions in support of numerical
  45.     programming.  It provides a set of environmental controls similar to
  46.     the ones found in <SANE.h>.  Programs that test flags or run under
  47.     non-default modes must do so under the effect of an enabling
  48.     "fenv_access" pragma.
  49. */
  50. /********************************************************************************
  51. *                                                                               *
  52. *    fenv_t         is a type for representing the entire floating-point        *
  53. *                   environment in a single object.                             *
  54. *                                                                               *
  55. *    fexcept_t      is a type for representing the floating-point               *
  56. *                   exception flag state collectively.                          *
  57. *                                                                               *
  58. ********************************************************************************/
  59. #if TARGET_CPU_PPC
  60. typedef long                            fenv_t;
  61. typedef long                            fexcept_t;
  62. /*    Definitions of floating-point exception macros                          */
  63. enum {
  64.     FE_INEXACT                  = 0x02000000,
  65.     FE_DIVBYZERO                = 0x04000000,
  66.     FE_UNDERFLOW                = 0x08000000,
  67.     FE_OVERFLOW                 = 0x10000000,
  68.     FE_INVALID                  = 0x20000000
  69. };
  70. /*    Definitions of rounding direction macros                                */
  71. enum {
  72.     FE_TONEAREST                = 0x00000000,
  73.     FE_TOWARDZERO               = 0x00000001,
  74.     FE_UPWARD                   = 0x00000002,
  75.     FE_DOWNWARD                 = 0x00000003
  76. };
  77. #endif  /* TARGET_CPU_PPC */
  78. #if TARGET_CPU_68K
  79. #if TARGET_RT_MAC_68881
  80. typedef long                            fexcept_t;
  81. struct fenv_t {
  82.     long                            FPCR;
  83.     long                            FPSR;
  84. };
  85. typedef struct fenv_t                   fenv_t;
  86. enum {
  87.     FE_INEXACT                  = 0x00000008,                   /* ((long)(8))   */
  88.     FE_DIVBYZERO                = 0x00000010,                   /* ((long)(16))  */
  89.     FE_UNDERFLOW                = 0x00000020,                   /* ((long)(32))  */
  90.     FE_OVERFLOW                 = 0x00000040,                   /* ((long)(64))  */
  91.     FE_INVALID                  = 0x00000080                    /* ((long)(128)) */
  92. };
  93. #else
  94. typedef short                           fexcept_t;
  95. typedef short                           fenv_t;
  96. enum {
  97.     FE_INVALID                  = 0x0001,                       /* ((short)(1))  */
  98.     FE_UNDERFLOW                = 0x0002,                       /* ((short)(2))  */
  99.     FE_OVERFLOW                 = 0x0004,                       /* ((short)(4))  */
  100.     FE_DIVBYZERO                = 0x0008,                       /* ((short)(8))  */
  101.     FE_INEXACT                  = 0x0010                        /* ((short)(16)) */
  102. };
  103. #endif  /* TARGET_RT_MAC_68881 */
  104. enum {
  105.     FE_TONEAREST                = 0x0000,                       /* ((short)(0))  */
  106.     FE_UPWARD                   = 0x0001,                       /* ((short)(1))  */
  107.     FE_DOWNWARD                 = 0x0002,                       /* ((short)(2))  */
  108.     FE_TOWARDZERO               = 0x0003                        /* ((short)(3))  */
  109. };
  110. /*    Definitions of rounding precision macros  (68K only)                    */
  111. enum {
  112.     FE_LDBLPREC                 = 0x0000,                       /* ((short)(0))  */
  113.     FE_DBLPREC                  = 0x0001,                       /* ((short)(1))  */
  114.     FE_FLTPREC                  = 0x0002                        /* ((short)(2))  */
  115. };
  116. #endif  /* TARGET_CPU_68K */
  117. /*    The bitwise OR of all exception macros                                  */
  118. #define      FE_ALL_EXCEPT     ( FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID )
  119. /*    Definition of pointer to IEEE default environment object                */
  120. extern fenv_t _FE_DFL_ENV;               /* default environment object        */
  121. #define FE_DFL_ENV &_FE_DFL_ENV          /* pointer to default environment    */
  122. /*******************************************************************************
  123. *     The following functions provide access to the exception flags.  The      *
  124. *     "int" input argument can be constructed by bitwise ORs of the exception  *
  125. *     macros: for example: FE_OVERFLOW | FE_INEXACT.                           *
  126. *******************************************************************************/
  127. /*******************************************************************************
  128. *     The function "feclearexcept" clears the supported exceptions represented *
  129. *     by its argument.                                                         *
  130. *******************************************************************************/
  131. EXTERN_API_C( void ) feclearexcept(int excepts);
  132. /*******************************************************************************
  133. *    The function "fegetexcept" stores a representation of the exception       *
  134. *     flags indicated by the argument "excepts" through the pointer argument   *
  135. *     "flagp".                                                                 *
  136. *******************************************************************************/
  137. EXTERN_API_C( void ) fegetexcept(fexcept_t *flagp, int excepts);
  138. /*******************************************************************************
  139. *     The function "feraiseexcept" raises the supported exceptions             *
  140. *     represented by its argument.                                             *
  141. *******************************************************************************/
  142. EXTERN_API_C( void ) feraiseexcept(int excepts);
  143. /*******************************************************************************
  144. *     The function "fesetexcept" sets or clears the exception flags indicated  *
  145. *     by the int argument "excepts" according to the representation in the     *
  146. *     object pointed to by the pointer argument "flagp".  The value of         *
  147. *     "*flagp" must have been set by a previous call to "fegetexcept".         *
  148. *     This function does not raise exceptions; it just sets the state of       *
  149. *     the flags.                                                               *
  150. *******************************************************************************/
  151. EXTERN_API_C( void ) fesetexcept(const fexcept_t *flagp, int excepts);
  152. /*******************************************************************************
  153. *     The function "fetestexcept" determines which of the specified subset of  *
  154. *     the exception flags are currently set.  The argument "excepts" specifies *
  155. *     the exception flags to be queried as a bitwise OR of the exception       *
  156. *     macros.  This function returns the bitwise OR of the exception macros    *
  157. *     corresponding to the currently set exceptions included in "excepts".     *
  158. *******************************************************************************/
  159. EXTERN_API_C( int ) fetestexcept(int excepts);
  160. /*******************************************************************************
  161. *     The following functions provide control of rounding direction modes.     *
  162. *******************************************************************************/
  163. /*******************************************************************************
  164. *     The function "fegetround" returns the value of the rounding direction    *
  165. *     macro which represents the current rounding direction.                   *
  166. *******************************************************************************/
  167. EXTERN_API_C( int ) fegetround(void );
  168. /*******************************************************************************
  169. *     The function "fesetround" establishes the rounding direction represented *
  170. *     by its argument.  It returns nonzero if and only if the argument matches *
  171. *     a rounding direction macro.  If not, the rounding direction is not       *
  172. *     changed.                                                                 *
  173. *******************************************************************************/
  174. EXTERN_API_C( int ) fesetround(int round);
  175. /*******************************************************************************
  176. *    The following functions manage the floating-point environment, exception  *
  177. *    flags and dynamic modes, as one entity.                                   *
  178. *******************************************************************************/
  179. /*******************************************************************************
  180. *     The function "fegetenv" stores the current floating-point environment    *
  181. *     in the object pointed to by its pointer argument "envp".                 *
  182. *******************************************************************************/
  183. EXTERN_API_C( void ) fegetenv(fenv_t *envp);
  184. /*******************************************************************************
  185. *     The function "feholdexcept" saves the current environment in the object  *
  186. *     pointed to by its pointer argument "envp", clears the exception flags,   *
  187. *     and clears floating-point exception enables.  This function supersedes   *
  188. *     the SANE function "procentry", but it does not change the current        *
  189. *     rounding direction mode.                                                 *
  190. *******************************************************************************/
  191. EXTERN_API_C( int ) feholdexcept(fenv_t *envp);
  192. /*******************************************************************************
  193. *     The function "fesetenv" installs the floating-point environment          *
  194. *     environment represented by the object pointed to by its argument         *
  195. *     "envp".  The value of "*envp" must be set by a call to "fegetenv" or     *
  196. *     "feholdexcept", by an implementation-defined macro of type "fenv_t",     *
  197. *     or by the use of the pointer macro FE_DFL_ENV as the argument.           *
  198. *******************************************************************************/
  199. EXTERN_API_C( void ) fesetenv(const fenv_t *envp);
  200. /*******************************************************************************
  201. *     The function "feupdateenv" saves the current exceptions into its         *
  202. *     automatic storage, installs the environment represented through its      *
  203. *     pointer argument "envp", and then re-raises the saved exceptions.        *
  204. *     This function, which supersedes the SANE function "procexit", can be     *
  205. *     used in conjunction with "feholdexcept" to write routines which hide     *
  206. *     spurious exceptions from their callers.                                  *
  207. *******************************************************************************/
  208. EXTERN_API_C( void ) feupdateenv(const fenv_t *envp);
  209. #if TARGET_CPU_68K
  210. /*******************************************************************************
  211. *     The following functions provide control of rounding precision.           *
  212. *     Because the PowerPC does not provide this capability, these functions    *  
  213. *     are available only for the 68K Macintosh.  Rounding precision values     *
  214. *     are defined by the rounding precision macros.  These functions are       *
  215. *     equivalent to the SANE functions getprecision and setprecision.          *
  216. *******************************************************************************/
  217. #if CALL_NOT_IN_CARBON
  218. EXTERN_API_C( int ) fegetprec(void );
  219. EXTERN_API_C( int ) fesetprec(int precision);
  220. #endif  /* CALL_NOT_IN_CARBON */
  221. #endif  /* TARGET_CPU_68K */
  222. #endif  /* TARGET_OS_MAC */
  223. #if PRAGMA_STRUCT_ALIGN
  224.     #pragma options align=reset
  225. #elif PRAGMA_STRUCT_PACKPUSH
  226.     #pragma pack(pop)
  227. #elif PRAGMA_STRUCT_PACK
  228.     #pragma pack()
  229. #endif
  230. #ifdef PRAGMA_IMPORT_OFF
  231. #pragma import off
  232. #elif PRAGMA_IMPORT
  233. #pragma import reset
  234. #endif
  235. #ifdef __cplusplus
  236. }
  237. #endif
  238. #endif /* __FENV__ */