%mathpiper,def="ExpN'Doubling"

/** This file contains routines for numerical evaluation of elementary functions:
 *  PowerN, ExpN, SinN etc.
 *  It is assumed that the arguments are real (not complex) floating-point or integer numbers. (The {InNumericMode()} flag does not have to be set.)
 *  The result is an exact integer or a floating-point number correct to BuiltinPrecisionGet() digits.
 *
 *  If a better optimized version of these functions is available through the kernel,
 *  then the kernel version will automatically shadow these functions.
 *  These implementations are not necessarily the best optimized versions.
 */

/// Identity transformation, compute Exp(x)-1 from value=Exp(x/2^n)-1

ExpN'Doubling1(value, n) :=
[
	Local(shift, result);
	shift := n;
	result := value;
	While (shift>0)	// lose 'shift' bits of precision here
	[
		result := MathMul2Exp(result, 1) + MultiplyN(result, result);
		shift--;
	];
	result;
];

/// Identity transformation, compute Exp(x) from value=Exp(x/2^n)
/*
ExpN'Doubling(value, n) :=
[
	Local(shift, result);
	shift := n;
	result := value;
	While (shift>0)	// lose 'shift' bits of precision here
	[
		result := MultiplyN(result, result);
		shift--;
	];
	result;
];
*/

%/mathpiper