shithub: jxl

ref: f080353c96b53a7b881f470d8e8f6e1151fa6524
dir: /ldexpf.c/

View raw version
#include <math.h>
#include <stdint.h>

float ldexpf(float x, int n)
{
	union {float f; uint32_t i;} u;
	float y = x;
	union {
		float f;
		u32int x;
	}oneP[] = {
		{.x = 0x7f000000},
		{.x = 0x800000},
		{.x = 0x4b800000},
	};

	if (n > 127) {
		y *= oneP[0].f;
		n -= 127;
		if (n > 127) {
			y *= oneP[0].f;
			n -= 127;
			if (n > 127)
				n = 127;
		}
	} else if (n < -126) {
		y *= oneP[1].f * oneP[2].f;
		n += 126 - 24;
		if (n < -126) {
			y *= oneP[1].f * oneP[2].f;
			n += 126 - 24;
			if (n < -126)
				n = -126;
		}
	}
	u.i = (uint32_t)(0x7f+n)<<23;
	x = y * u.f;
	return x;
}