Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdint.h>
- #include <math.h>
- //vytvorenie aliasu pre datovy typ
- typedef uint16_t UQ_t;
- // saturovanie do maximalnej hodnoty 16-bitoveho Q cisla pri presiahnuti rozsahu Q cisla
- UQ_t saturate(uint32_t x)
- {
- if (x > 65535)
- return 65535;
- else
- return (uint16_t)x;
- }
- //prevod cisla s plavajucou desatinnou ciarkou na Q cislo
- UQ_t float2Q (double realne, int n)
- {
- UQ_t result = saturate((uint32_t)round(realne*(pow(2,n))));
- return result;
- }
- //prevod Q cisla na cislo s plavajucou desatinnou ciarkou
- double Q2float (UQ_t q, int n)
- {
- double result = q/(pow(2,n));
- return result;
- }
- //nasobenie dvoch Q cisel
- UQ_t multQ(UQ_t a, UQ_t b,int n)
- {
- UQ_t result;
- uint32_t temp;
- temp = (uint32_t)a * (uint32_t)b;
- result = saturate(temp >> n);
- return result;
- }
- //vypocet chyby nasobenia
- double multQ_Err(UQ_t inQ, double inDouble, int n)
- {
- return fabs((Q2float(inQ,n))-inDouble);
- }
- //telo programu
- int main()
- {
- int m,n;
- double inA[10];
- double inB[10];
- double errVal[10] = {0};
- UQ_t Qresult[10] = {0};
- double Fresult[10] = {0};
- double errSum = 0;
- double errAvg = 0;
- scanf("%d %d",&m,&n);
- double resolution = pow(2,(-n));
- for (int i=0; i<10; i++)
- {
- scanf ("%lf %lf", &inA[i],&inB[i]);
- Qresult[i] = multQ(float2Q(inA[i],n),
- float2Q(inB[i],n),
- n);
- Fresult[i] = (inA[i]*inB[i]);
- errVal[i] = multQ_Err(Qresult[i],Fresult[i],n);
- errSum += errVal[i];
- errAvg = errSum/(i+1);
- }
- printf("Priemerna chyba prevodu a nasobenia je %.*lf, co je ",n,errAvg);
- if (errAvg > resolution)
- {
- printf("viac ako rozlisenie prevodu %.*lf.",n,resolution);
- return 0;
- }
- printf("menej ako rozlisenie prevodu %.*lf.",n,resolution);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement