Bprint(bout, "0x%llux\n", n->val.u.bval);
break;
case CTFLT:
- Bprint(bout, "%.17e\n", mpgetflt(n->val.u.fval));
+ Bprint(bout, "%F\n", n->val.u.fval);
break;
case CTSTR:
Bprint(bout, "\"%Z\"\n", n->val.u.sval);
mpatoflt(Mpflt *a, char *as)
{
Mpflt b;
- int dp, c, f, ef, ex, zer;
+ int dp, c, f, ef, ex, eb, zer;
char *s;
s = as;
dp = 0; /* digits after decimal point */
f = 0; /* sign */
ex = 0; /* exponent */
+ eb = 0; /* binary point */
zer = 1; /* zero */
mpmovecflt(a, 0.0);
dp++;
continue;
+ case 'P':
+ case 'p':
+ eb = 1;
+
case 'E':
case 'e':
ex = 0;
break;
}
+ if(eb) {
+ if(dp)
+ goto bad;
+ a->exp += ex;
+ goto out;
+ }
+
if(dp)
dp--;
if(mpcmpfltc(a, 0.0) != 0) {
mpdivfltflt(a, &b);
}
}
+
+out:
if(f)
mpnegflt(a);
return;
Fconv(Fmt *fp)
{
char buf[500];
- Mpflt *fval;
+ Mpflt *fvp, fv;
+
+ fvp = va_arg(fp->args, Mpflt*);
+ if(sigfig(fvp) == 0) {
+ snprint(buf, sizeof(buf), "0p+0");
+ goto out;
+ }
+ fv = *fvp;
+
+ while(fv.val.a[0] == 0) {
+ mpshiftfix(&fv.val, -Mpscale);
+ fv.exp += Mpscale;
+ }
+ while((fv.val.a[0]&1) == 0) {
+ mpshiftfix(&fv.val, -1);
+ fv.exp += 1;
+ }
- fval = va_arg(fp->args, Mpflt*);
- if(fval->exp >= 0)
- snprint(buf, sizeof(buf), "(%B*2^%d)", &fval->val, fval->exp);
- else
- snprint(buf, sizeof(buf), "(%B/2^%d)", &fval->val, -fval->exp);
+ if(fv.exp >= 0) {
+ snprint(buf, sizeof(buf), "%Bp+%d", &fv.val, fv.exp);
+ goto out;
+ }
+ snprint(buf, sizeof(buf), "%Bp-%d", &fv.val, -fv.exp);
+
+out:
return fmtstrcpy(fp, buf);
}