float.c 885 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include <u.h>
  2. #include <libc.h>
  3. #define DPRECSTR "0.0000004000000000125"
  4. #define DPREC 0.0000004000000000125
  5. #define DIEEELO 0x9ac0499f
  6. #define DIEEEHI 0x3e9ad7f2
  7. jmp_buf errj;
  8. char *err;
  9. void
  10. catcher(void *u, char *s)
  11. {
  12. err = 0;
  13. if(strncmp(s, "sys: fp:", 8) == 0){
  14. err = s;
  15. notejmp(u, errj, 0);
  16. }
  17. noted(NDFLT);
  18. }
  19. void
  20. tstdiv(double p)
  21. {
  22. double r = 1.0;
  23. r /= p;
  24. print("1/%0.20g = %0.20g\n", p, r);
  25. }
  26. void
  27. main(void)
  28. {
  29. double p = DPREC;
  30. int d[2] = { DIEEELO, DIEEEHI };
  31. uint64_t dieee, q;
  32. dieee = *(uint64_t*)d;
  33. q = *(uint64_t*)&p;
  34. err = 0;
  35. notify(catcher);
  36. setjmp(errj);
  37. if(err){
  38. fprint(2, "%s\n", err);
  39. exits("FAIL");
  40. }
  41. fprint(2, "Double-precision test number: %s\n", DPRECSTR);
  42. fprint(2, "Expected internal representation: %llx\n", dieee);
  43. fprint(2, "Actual internal representation: %llx\n", q);
  44. if(q != dieee)
  45. exits("FAIL");
  46. tstdiv(p);
  47. }