erff.c   [plain text]



/*
 *	erff.c
 *
 *		by Ian Ollmann
 *
 *	Copyright (c) 2007, Apple Inc. All Rights Reserved.
 */
 
#include <math.h>
#include <stdint.h>
#include "erf.h"

float erff( float x )
{
	union{ float d; uint32_t u;} u = { x };

	uint32_t	sign = u.u & 0x80000000U;

	//Inf, NaN, 0
	if( (u.u & 0x7fffffffU) - 1U >= 0x7f800000U - 1U )
	{
		if( 0.0f == x )
			return x;
	
		if( x != x )
			return x + x;
			
		u.u = 0x3f800000U | sign;
		return u.d;
	}
	
	u.d = (float) ErrFunApprox( (double) x, 1.0, 0 );
	u.u ^= sign;
	return u.d;
}