view lphobos/std/c/fenv.d @ 108:288fe1029e1f trunk

[svn r112] Fixed 'case 1,2,3:' style case statements. Fixed a bunch of bugs with return/break/continue in loops. Fixed support for the DMDFE hidden implicit return value variable. This can be needed for some foreach statements where the loop body is converted to a nested delegate, but also possibly returns from the function. Added std.math to phobos. Added AA runtime support code, done ground work for implementing AAs. Several other bugfixes.
author lindquist
date Tue, 20 Nov 2007 05:29:20 +0100
parents c53b6e3fe49a
children
line wrap: on
line source


/**
 * C's <fenv.h>
 * Authors: Walter Bright, Digital Mars, www.digitalmars.com
 * License: Public Domain
 * Macros:
 *	WIKI=Phobos/StdCFenv
 */

module std.c.fenv;

extern (C):

/// Entire floating point environment

struct fenv_t
{
    version (Windows)
    {
	ushort status;
	ushort control;
	ushort round;
	ushort reserved[2];
    }
    else version (linux)
    {
	ushort __control_word;
	ushort __unused1;
	ushort __status_word;
	ushort __unused2;
	ushort __tags;
	ushort __unused3;
	uint __eip;
	ushort __cs_selector;
	ushort __opcode;
	uint __data_offset;
	ushort __data_selector;
	ushort __unused5;
    }
    else
    {
	static assert(0);
    }
}

alias int fexcept_t;	/// Floating point status flags

/// The various floating point exceptions
enum
{
    FE_INVALID		= 1,		///
    FE_DENORMAL		= 2,		///
    FE_DIVBYZERO	= 4,		///
    FE_OVERFLOW		= 8,		///
    FE_UNDERFLOW	= 0x10,		///
    FE_INEXACT		= 0x20,		///
    FE_ALL_EXCEPT	= 0x3F,		/// Mask of all the exceptions
}

/// Rounding modes
enum
{
    FE_TONEAREST	= 0,		///
    FE_UPWARD		= 0x800,	///
    FE_DOWNWARD		= 0x400,	///
    FE_TOWARDZERO	= 0xC00,	///
}

version (Windows)
{
    extern fenv_t _FE_DFL_ENV;

    /// Default floating point environment
    fenv_t* FE_DFL_ENV = &_FE_DFL_ENV;
}
else version (linux)
{
    /// Default floating point environment
    fenv_t* FE_DFL_ENV = cast(fenv_t*)(-1);
}
else
{
    static assert(0);
}

/// Floating point precision
enum
{
    FE_FLTPREC	= 0,			///
    FE_DBLPREC	= 0x200,		///
    FE_LDBLPREC	= 0x300,		///
}

int fetestexcept(int excepts);		///
int feraiseexcept(int excepts);		///
int feclearexcept(int excepts);		///
//int fegetexcept(fexcept_t *flagp,int excepts);	///
//int fesetexcept(fexcept_t *flagp,int excepts);	///
int fegetround();			///
int fesetround(int round);		///
int fegetprec();			///
int fesetprec(int prec);		///
int fegetenv(fenv_t *envp);		///
int fesetenv(fenv_t *envp);		///
//void feprocentry(fenv_t *envp);	///
//void feprocexit(const fenv_t *envp);	///

int fegetexceptflag(fexcept_t *flagp,int excepts);	///
int fesetexceptflag(fexcept_t *flagp,int excepts);	///
int feholdexcept(fenv_t *envp);		///
int feupdateenv(fenv_t *envp);		///