void operator_fraction() { fraction result; char in[USHRT_MAX]; double numerator; double denominator; printf("Entre com o 1º numerador: "); scanf("%s", in); printf("\n"); numerator = atof(in); while (1) { printf("Entre com o 1º denominador: "); scanf("%s", in); printf("\n"); denominator = atof(in); if (denominator == 0) printf("Denominador inválido!\n\n"); else break; } result = fraction_constructor(numerator, denominator); int keep_going = 1; while (keep_going) { switch (menu_fraction()) { case 1: // Add printf("Entre com o próximo numerador: "); scanf("%s", in); printf("\n"); numerator = atof(in); while (1) { printf("Entre com o próximo denominador: "); scanf("%s", in); printf("\n"); denominator = atof(in); if (denominator == 0) printf("Denominador inválido!\n\n"); else break; } fraction_add(&result, fraction_constructor(numerator, denominator)); break; case 2: // Subtract printf("Entre com o próximo numerador: "); scanf("%s", in); printf("\n"); numerator = atof(in); while (1) { printf("Entre com o próximo denominador: "); scanf("%s", in); printf("\n"); denominator = atof(in); if (denominator == 0) printf("Denominador inválido!\n\n"); else break; } fraction_subtract(&result, fraction_constructor(numerator, denominator)); break; case 3: // Multiply printf("Entre com o próximo numerador: "); scanf("%s", in); printf("\n"); numerator = atof(in); while (1) { printf("Entre com o próximo denominador: "); scanf("%s", in); printf("\n"); denominator = atof(in); if (denominator == 0) printf("Denominador inválido!\n\n"); else break; } fraction_multiply(&result, fraction_constructor(numerator, denominator)); break; case 4: // Power while (1) { printf("Entre com o próximo valor: "); scanf("%s", in); printf("\n"); fraction original = result; fraction_power(&result, atof(in)); if (isnan(result.numerator) || isnan(result.denominator)) { result = original; printf("Valor inválido!\n\n"); } else break; } break; case 5: // Divide while (1) { printf("Entre com o próximo numerador: "); scanf("%s", in); printf("\n"); numerator = atof(in); if (numerator == 0) printf("Numerador inválido!\n\n"); else break; } while (1) { printf("Entre com o próximo denominador: "); scanf("%s", in); printf("\n"); denominator = atof(in); if (denominator == 0) printf("Denominador inválido!\n\n"); else break; } fraction_divide(&result, fraction_constructor(numerator, denominator)); break; default: keep_going = 0; break; } char *string = fraction_string(result); printf("Resultado: %s\n\n", string); free(string); } }
fraction_t *fraction_subtract(const fraction_t *x, const fraction_t *y) { fraction_t *minus_y = fraction_negate(y); fraction_t *result = fraction_add(x, minus_y); fraction_free(minus_y); return result; }
int iec61883_cip_fill_header(raw1394handle_t handle, struct iec61883_cip *ptz, struct iec61883_packet *packet) { struct iec61883_fraction next; int nevents, nevents_dbc, syt_index, syt; fraction_add(&next, &ptz->ready_samples, &ptz->samples_per_cycle); if (ptz->mode == IEC61883_MODE_BLOCKING_EMPTY || ptz->mode == IEC61883_MODE_BLOCKING_NODATA) { if (fraction_floor(&next) >= ptz->syt_interval) nevents = ptz->syt_interval; else nevents = 0; } else nevents = fraction_floor(&next); if (ptz->mode == IEC61883_MODE_BLOCKING_NODATA) { /* The DBC is incremented even with NO_DATA packets. */ nevents_dbc = ptz->syt_interval; } else { nevents_dbc = nevents; } /* Now that we know how many events to put in the packet, update the * fraction ready_samples. */ fraction_sub_int(&ptz->ready_samples, &next, nevents); /* Calculate synchronization timestamp (syt). First we * determine syt_index, that is, the index in the packet of * the sample for which the timestamp is valid. */ syt_index = (ptz->syt_interval - ptz->dbc) & (ptz->syt_interval - 1); if (syt_index < nevents) { syt = ((ptz->cycle_count << 12) | fraction_floor(&ptz->cycle_offset)) & 0xffff; fraction_add(&ptz->cycle_offset, &ptz->cycle_offset, &ptz->ticks_per_syt_offset); /* The cycle_count field is a 13 bits value that goes from 0 to 7999. * The cycle_offset field is a 12 bits value that goes from 0 to 3071. */ ptz->cycle_count += ptz->cycle_offset.integer / 3072; ptz->cycle_count %= 8000; ptz->cycle_offset.integer %= 3072; } else syt = 0xffff; packet->eoh0 = 0; /* Our node ID can change after a bus reset, so it is best to fetch * our node ID for each packet. */ packet->sid = raw1394_get_local_id( handle ) & 0x3f; packet->dbs = ptz->dbs; packet->fn = 0; packet->qpc = 0; packet->sph = 0; packet->reserved = 0; packet->dbc = ptz->dbc; packet->eoh1 = 2; packet->fmt = ptz->format; if ( nevents == 0 && ptz->mode == IEC61883_MODE_BLOCKING_NODATA ) { /* FDF code for packets containing dummy data. */ packet->fdf = IEC61883_FDF_NODATA; } else { /* FDF code for non-blocking mode and for blocking mode with empty packets. */ packet->fdf = ptz->fdf; } packet->syt = htons(syt); ptz->dbc += nevents_dbc; return nevents; }