tweak treatment of IEEE scaling

This commit is contained in:
Martin Reinecke 2012-10-19 08:53:04 +02:00
parent 148dca926a
commit 6130ad3144
2 changed files with 8 additions and 7 deletions

View file

@ -109,7 +109,7 @@ static inline int Y(rescale) (Tb * restrict lam1, Tb * restrict lam2,
int did_scale=0;
for (int i=0;i<nvec; ++i)
{
Tv mask = vgt(vabs(lam2->v[i]),vone);
Tv mask = vgt(vabs(lam2->v[i]),vload(sharp_ftol));
if (vanyTrue(mask))
{
did_scale=1;
@ -126,20 +126,20 @@ static inline void Y(normalize) (Tb * restrict val, Tb * restrict scale)
const Tv vfsmall=vload(sharp_fsmall), vfbig=vload(sharp_fbig);
for (int i=0;i<nvec; ++i)
{
Tv mask = vgt(vabs(val->v[i]),vone);
Tv mask = vgt(vabs(val->v[i]),vload(sharp_ftol));
while (vanyTrue(mask))
{
vmuleq(val->v[i],vblend(mask,vfsmall,vone));
vaddeq(scale->v[i],vblend(mask,vone,vzero));
mask = vgt(vabs(val->v[i]),vone);
mask = vgt(vabs(val->v[i]),vload(sharp_ftol));
}
mask = vlt(vabs(val->v[i]),vfsmall);
mask = vlt(vabs(val->v[i]),vload(sharp_fsmall*sharp_ftol));
mask = vand(mask,vne(val->v[i],vzero));
while (vanyTrue(mask))
{
vmuleq(val->v[i],vblend(mask,vfbig,vone));
vsubeq(scale->v[i],vblend(mask,vone,vzero));
mask = vlt(vabs(val->v[i]),vfsmall);
mask = vlt(vabs(val->v[i]),vload(sharp_fsmall*sharp_ftol));
mask = vand(mask,vne(val->v[i],vzero));
}
}

View file

@ -36,8 +36,9 @@
extern "C" {
#endif
enum { sharp_minscale=-10, sharp_limscale=0, sharp_maxscale=2 };
static const double sharp_fbig=0x1p+90,sharp_fsmall=0x1p-90;
enum { sharp_minscale=-1, sharp_limscale=1, sharp_maxscale=1 };
static const double sharp_fbig=0x1p+450,sharp_fsmall=0x1p-450;
static const double sharp_ftol=0x1p-60;
typedef struct { double f[2]; } sharp_ylmgen_dbl2;
typedef struct { double f[3]; } sharp_ylmgen_dbl3;