int main(void) { int i; double v1 = 0; float v2 = 0; float res[3]; if (!efac_init()) { printf("init failed!\n"); return 1; } efac_clear(0); for (i = 1; i < 100000000; i+=PER_LOOP) { #if PER_LOOP == 1 float f = 1.0 / i; v1 += f; v2 += f; efac_add(0, f); #elif PER_LOOP == 4 efac_add4(0, 1.0 / (i + 0), 1.0 / (i + 1), 1.0 / (i + 2), 1.0 / (i + 3)); #else #error unsupported PER_LOOP value #endif // printf("vals: %f %f %f\n", v1, v2, efac_read(0)); } res[0] = efac_read_round_nearest(0); res[1] = efac_read_round_inf(0); res[2] = efac_read_round_zero(0); printf("vals: %.18e %e %.18e %.18e %.18e\n", v1, v2, res[0], res[1], res[2]); printf("vals: %.18e %e %.18e\n", (float)v1, v2, efac_read(0)); printf("vals: %x %x %x\n", flt2int(res[0]), flt2int(res[1]), flt2int(res[2])); return 0; }
void listline(char *var, statement *stmt, byte showline) { int x; outcount = 0; if (stmt->errorflag) { mysprintf(var, "*ERR "); for (x=0; x<tokenpos; x++) mysprintf(var, " "); mysprintf(var, "V\n"); } if (showline) mysprintf(var, "%.5d ", stmt->linenum); if (stmt->errorflag) { mysprintf(var, "%s", stmt->metalist[1].stringarg); return; } if (stmt->numlabels) { for (x=0; x<stmt->numlabels; x++) mysprintf(var, "%s: ", get_labelname(stmt->labelset[x]->labelnum)); } mysprintf(var, "%s ", get_opname(stmt->opcode)); switch(stmt->opcode) { case CMD_DEFFN: list_deffn(var, stmt); break; case CMD_REM: mysprintf(var, "%s", stmt->metalist[1].stringarg); break; case CMD_IF: list_if(var, stmt); break; case CMD_LET: list_let(var, stmt); break; case CMD_SETESC: case CMD_SETERR: case CMD_GOTO: case CMD_GOSUB: if (stmt->metalist[1].operation == LABELREF) mysprintf(var, "%s", get_labelname(stmt->metalist[1].shortarg)); else mysprintf(var, "%.5d", stmt->metalist[1].shortarg); break; case CMD_FOR: list_for(var, stmt); break; case CMD_NEXT: mysprintf(var, "%s", get_symname(stmt->metalist[1].shortarg)); break; case CMD_LIST: case CMD_DELETE: if (stmt->metapos == 1) mysprintf(var, "00001, 65534"); else if (stmt->metapos == 2) mysprintf(var, "%.5d", flt2int(stmt->metalist[1].floatarg)); else mysprintf(var, "%.5d, %.5d", flt2int(stmt->metalist[1].floatarg), flt2int(stmt->metalist[3].floatarg)); break; case CMD_RETURN: case CMD_WEND: case CMD_RETRY: case CMD_SETERRON: case CMD_SETERROFF: break; case CMD_ON: list_on(var, stmt); break; default: if (stmt->metapos == 1) break; simplifylist(var, stmt, 0, stmt->metapos); mysprintf(var, "%s", listpop()); break; } }