Advertisement
majkl36

MC_IT_prevod_na_Q_cisla

May 4th, 2024
877
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.95 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #include <math.h>
  5.  
  6. //vytvorenie aliasu pre datovy typ
  7. typedef uint16_t UQ_t;
  8. // saturovanie do maximalnej hodnoty 16-bitoveho Q cisla pri presiahnuti rozsahu Q cisla
  9. UQ_t saturate(uint32_t x)
  10. {
  11.     if (x > 65535)
  12.         return 65535;
  13.     else
  14.         return (uint16_t)x;
  15. }
  16. //prevod cisla s plavajucou desatinnou ciarkou na Q cislo
  17. UQ_t float2Q (double realne, int n)
  18. {
  19.     UQ_t result = saturate((uint32_t)round(realne*(pow(2,n))));
  20.     return result;
  21. }
  22. //prevod Q cisla na cislo s plavajucou desatinnou ciarkou
  23. double Q2float (UQ_t q, int n)
  24. {
  25.     double result = q/(pow(2,n));
  26.     return result;
  27. }
  28.  
  29. //nasobenie dvoch Q cisel
  30. UQ_t multQ(UQ_t a, UQ_t b,int n)
  31. {
  32.     UQ_t result;
  33.     uint32_t temp;
  34.  
  35.     temp = (uint32_t)a * (uint32_t)b;
  36.     result = saturate(temp >> n);
  37.  
  38.     return result;
  39. }
  40. //vypocet chyby nasobenia
  41. double multQ_Err(UQ_t inQ, double inDouble, int n)
  42. {
  43.     return fabs((Q2float(inQ,n))-inDouble);
  44. }
  45. //telo programu
  46. int main()
  47. {
  48.     int m,n;
  49.     double inA[10];
  50.     double inB[10];
  51.  
  52.     double errVal[10] = {0};
  53.     UQ_t Qresult[10] = {0};
  54.     double Fresult[10] = {0};
  55.     double errSum = 0;
  56.     double errAvg = 0;
  57.  
  58.     scanf("%d %d",&m,&n);
  59.  
  60.     double resolution = pow(2,(-n));
  61.     for (int i=0; i<10; i++)
  62.     {
  63.         scanf ("%lf %lf", &inA[i],&inB[i]);
  64.  
  65.         Qresult[i] = multQ(float2Q(inA[i],n),
  66.                            float2Q(inB[i],n),
  67.                            n);
  68.         Fresult[i] = (inA[i]*inB[i]);
  69.  
  70.         errVal[i] = multQ_Err(Qresult[i],Fresult[i],n);
  71.  
  72.         errSum += errVal[i];
  73.  
  74.         errAvg = errSum/(i+1);
  75.     }
  76.     printf("Priemerna chyba prevodu a nasobenia je %.*lf, co je ",n,errAvg);
  77.     if (errAvg > resolution)
  78.     {
  79.         printf("viac ako rozlisenie prevodu %.*lf.",n,resolution);
  80.         return 0;
  81.     }
  82.     printf("menej ako rozlisenie prevodu %.*lf.",n,resolution);
  83.     return 0;
  84. }
  85.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement