예제 #1
0
strtof_l(CONST char *s, char **sp, locale_t loc)
#endif
{
    static FPI fpi0 = { 24, 1-127-24+1,  254-127-24+1, 1, SI };
    ULong bits[1];
    Long exp;
    int k;
    union {
        ULong L[1];
        float f;
    } u;
#ifdef Honor_FLT_ROUNDS
#include "gdtoa_fltrnds.h"
#else
#define fpi &fpi0
#endif

    k = strtodg_l(s, sp, fpi, &exp, bits, loc);
    switch(k & STRTOG_Retmask) {
    case STRTOG_NoNumber:
    case STRTOG_Zero:
        u.L[0] = 0;
        break;

    case STRTOG_Normal:
        u.L[0] = (bits[0] & 0x7fffff) | ((exp + 0x7f + 23) << 23);
        break;

    case STRTOG_NaNbits:
        /* FreeBSD local: always return a quiet NaN */
        u.L[0] = bits[0] | 0x7fc00000;
        break;

    case STRTOG_Denormal:
        u.L[0] = bits[0];
        break;

    case STRTOG_Infinite:
        u.L[0] = 0x7f800000;
        break;

    case STRTOG_NaN:
        u.L[0] = f_QNAN;
    }
    if (k & STRTOG_Neg)
        u.L[0] |= 0x80000000L;
    return u.f;
}
예제 #2
0
파일: strtorx.c 프로젝트: 0mp/freebsd
strtorx_l(CONST char *s, char **sp, int rounding, void *L, locale_t locale)
#endif
{
	static FPI fpi0 = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, SI };
	FPI *fpi, fpi1;
	ULong bits[2];
	Long exp;
	int k;

	fpi = &fpi0;
	if (rounding != FPI_Round_near) {
		fpi1 = fpi0;
		fpi1.rounding = rounding;
		fpi = &fpi1;
		}
	k = strtodg_l(s, sp, fpi, &exp, bits, locale);
	ULtox((UShort*)L, bits, exp, k);
	return k;
	}