char* DcmeDualModelDebugInfoStr(DcmeBookkeeping* b) { char* ddis = malloc(0x1000); real eem = NumVecMean(b->ent, K); real ees = NumVecStd(b->ent, K); sprintfc(ddis, 'g', 'k', "ENT:%.2e\u00b1%.2e", eem, ees); saprintf(ddis, " "); saprintf(ddis, "twps: %.3e zz: %02d", b->twps[b->last_updated_zz], b->last_updated_zz); if (NumIsNan(b->twps[b->last_updated_zz])) { saprintf(ddis, "NAN"); } else { char* pb = strprogbarc(b->twps[b->last_updated_zz], 80, 0); saprintf(ddis, "%s", pb); free(pb); } return ddis; }
int NumToString (Number value, char* out) { int i = 0, j = 0; byte halfmask, halfshift; Nybble* v = &value.MantissaLowest; char* p = out; if (NumIsOverflow(&value)) { *p++ = 'o'; *p++ = 'F'; *p++ = 'l'; *p++ = 'o'; *p++ = 'w'; *p = '\0'; return 6; } else if (NumIsUnderflow(&value)) { *p++ = 'u'; *p++ = 'F'; *p++ = 'l'; *p++ = 'o'; *p++ = 'w'; *p = '\0'; return 6; } else if (NumIsNan(&value)) { *p++ = 'N'; *p++ = 'a'; *p++ = 'N'; *p = '\0'; return 5; } else if (NumIsDiv0(&value)) { *p++ = 'D'; *p++ = 'i'; *p++ = 'v'; *p++ = '/'; *p++ = '0'; *p = '\0'; return 5; } if (NumIs0(&value)) { *p++ = '0'; *p = 0; return 2; } if (NumIsNegative(&value)) { *p++ = '-'; ++j; } j = i = NumDigitCount(&value); if (i == value.Exponent) { *p++ = '0'; *p++ = '.'; j += 2; } for (--i, v += (i / 2), halfshift = (i & 1) * 4, halfmask = (0xF) << halfshift; i > -1; --i) { halfshift = (i & 1) * 4; *p++ = ((v->All & halfmask) >> halfshift) + 48; halfmask = ~halfmask; v -= (halfmask == 0xF0); if (i == value.Exponent && i != 0) { *p++ = '.'; ++j; } } *p = 0; return j; }