int main(int argc, char*argv[]) { double start, koniec, krok, wynik; unsigned short precyzja, zaokraglenie, fpucw; fpucw = 0; wynik = 0; if(argc < 6) { printf("Podaj: wartosc poczatkowa, koncowa, krok, precyzje i tryb zaokraglenia:\n" "precyzja:\n" "0 - pojedyncza precyzja\n" "1 - podwojna precyzja\n" "2 - rozszerzona podwojna precyzja (domyslnie)\n" "tryb zaokraglenia:\n" "0 - zaokraglij do najblizszej (domyslnie)\n" "1 - zaokraglij w dol\n" "2 - zaokraglij w gore\n" "3 - zaokraglij do zera\n"); scanf("%lf %lf %lf %hu %hu", &start, &koniec, &krok, &precyzja, &zaokraglenie); } else { sscanf(argv[1], "%lf", &start); sscanf(argv[2], "%lf", &koniec); sscanf(argv[3], "%lf", &krok); sscanf(argv[4], "%hu", &precyzja); sscanf(argv[5], "%hu", &zaokraglenie); } fpucw = get_fpu(); // pobierz stare flagi printf("control word:\nbyl: %04x; ", fpucw); // wyliczenie odpowiedniej wartosci control word, na podstawie precyzji i zaokraglenia if(precyzja > 2) precyzja = 2; // jezeli precyzja > 2, to ustaw domyslna (rozszerzona podwojna) if(zaokraglenie > 3) zaokraglenie = 0; // jesli zaokraglenie > 3, to ustaw domyslne (do najblizszej) if(precyzja > 0) ++precyzja; // ustaw odpowiednia wartosc dla flagi precyzji (w uzyciu jest 0, 2, 3) precyzja <<= 8; // przesun precyzje na odpowiednie miejsce zaokraglenie <<= 10; // tak samo tryb zaokraglenia fpucw = 0x7f; // ustaw inne flagi (na podstawie wartosci domyslnej) fpucw |= precyzja; // dolacz nowe flagi fpucw |= zaokraglenie; set_fpu(fpucw); // ustaw nowe fpucw = get_fpu(); // pobierz nowe printf("jest: %04x\n", fpucw); wynik = calka(start, koniec, krok); // oblicz calke printf("int 1/x dx %lf..%lf = %lf\n", start, koniec, wynik); return 0; }
int main(int argc, char * argv[]) { unsigned short int fpucw = 0x1234; double dbls[3] = {123.45, 0.123, 0.0}; /* generate double constants */ unsigned long dbl = 0x4000000000000000; double * wsk = &dbl; dbls[1] = *wsk; printf("unsigned long: %lx\n", dbl); printf("unsigned long: %lf\n", *wsk); /* add two numbers */ dbls[2] = fpu_add(dbls[0], dbls[1]); printf("default: %lf + %lf = %lf\n", dbls[0], dbls[1], dbls[2]); /* print FPU control word */ fpucw = get_fpu(); printf("FPU CW: %04hx\n", fpucw); /* Return 0 if exiting normally. */ return 0; }