Advertisement
alansam

Floating point precision.

Mar 31st, 2023 (edited)
801
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.22 KB | Source Code | 0 0
  1. //  Floating point precision.
  2. //  - Updated to add GNU MP BigNum floating point example
  3.  
  4. //  opts: -Wall -Wpedantic -lgmp -std=gnu2x -fsanitize=address
  5.  
  6. #include <stdio.h>
  7. #include <gmp.h>
  8.  
  9. int main(int argc, char const * argv[]) {
  10.   float  fa = 1.0f;
  11.   float  fb = 3.0f;
  12.   float  fc = fa / fb;
  13.   puts("float:");
  14.   printf("    %%.7f: %.7f\n", fc);
  15.   printf("   %%.16f: %.16f\n", fc);
  16.   putchar('\n');
  17.  
  18.   double da = 1.0;
  19.   double db = 3.0;
  20.   double dc = da / db;
  21.   puts("double:");
  22.   printf("  %%.16lf: %.16lf\n", dc);
  23.   printf("  %%.19lf: %.19lf\n", dc);
  24.   putchar('\n');
  25.  
  26.   puts("long double:");
  27.   long double la = 1.0l;
  28.   long double lb = 3.0l;
  29.   long double lc = la / lb;
  30.   printf("  %%.19Lf: %.19Lf\n", lc);
  31.   printf("  %%.24Lf: %.24Lf\n", lc);
  32.   putchar('\n');
  33.  
  34.   _Float128 Qa = 1.0Q;
  35.   _Float128 Qb = 3.0Q;
  36.   _Float128 Qc = Qa / Qb;
  37.   puts("_Float128:");
  38.   printf("  %%.34Qf: %.34Qf\n", Qc);
  39.   printf("  %%.44Qf: %.44Qf\n", Qc);
  40.   putchar('\n');
  41.  
  42.   __float128 qa = 1.0q;
  43.   __float128 qb = 3.0q;
  44.   __float128 qc = qa / qb;
  45.   puts("__float128:");
  46.   printf("  %%.34Qf: %.34Qf\n", qc);
  47.   printf("  %%.44Qf: %.44Qf\n", qc);
  48.   putchar('\n');
  49.  
  50.   mpf_t ma;
  51.   mpf_t mb;
  52.   mpf_t mc;
  53.  
  54.   mpf_init2(ma, 256);
  55.   mpf_init2(mb, 256);
  56.   mpf_init2(mc, 256);
  57.  
  58.   mpf_set_d(ma, 1.0);
  59.   mpf_set_d(mb, 3.0);
  60.  
  61.   mpf_div(mc, ma, mb);
  62.  
  63.   puts("mpf_t:");
  64.   gmp_printf("  %%.79Ff: %.79Ff\n", mc);
  65.   gmp_printf("  %%.99Ff: %.99Ff\n", mc);
  66.   putchar('\n');
  67.  
  68.   mpf_clear(ma);
  69.   mpf_clear(mb);
  70.   mpf_clear(mc);
  71.  
  72.   return 0;
  73. }
  74.  
  75. /*
  76. Results -
  77. float:
  78.     %.7f: 0.3333333
  79.    %.16f: 0.3333333432674408
  80.  
  81. double:
  82.   %.16lf: 0.3333333333333333
  83.   %.19lf: 0.3333333333333333148
  84.  
  85. long double:
  86.   %.19Lf: 0.3333333333333333333
  87.   %.24Lf: 0.333333333333333333342368
  88.  
  89. _Float128:
  90.   %.34Qf: 0.3333333333333333333333333333333333
  91.   %.44Qf: 0.33333333333333333333333333333333331728391713
  92.  
  93. __float128:
  94.   %.34Qf: 0.3333333333333333333333333333333333
  95.   %.44Qf: 0.33333333333333333333333333333333331728391713
  96.  
  97. mpf_t:
  98.   %.79Ff: 0.3333333333333333333333333333333333333333333333333333333333333333333333333333333
  99.   %.99Ff: 0.333333333333333333333333333333333333333333333333333333333333333333333333333333300000000000000000000
  100.  */
  101.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement