nan.c 610 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include <u.h>
  2. #include <libc.h>
  3. #define NANEXP (2047<<20)
  4. #define NANMASK (2047<<20)
  5. #define NANSIGN (1<<31)
  6. double
  7. NaN(void)
  8. {
  9. FPdbleword a;
  10. a.hi = NANEXP;
  11. a.lo = 1;
  12. return a.x;
  13. }
  14. int
  15. isNaN(double d)
  16. {
  17. FPdbleword a;
  18. a.x = d;
  19. if((a.hi & NANMASK) != NANEXP)
  20. return 0;
  21. return !isInf(d, 0);
  22. }
  23. double
  24. Inf(int sign)
  25. {
  26. FPdbleword a;
  27. a.hi = NANEXP;
  28. a.lo = 0;
  29. if(sign < 0)
  30. a.hi |= NANSIGN;
  31. return a.x;
  32. }
  33. int
  34. isInf(double d, int sign)
  35. {
  36. FPdbleword a;
  37. a.x = d;
  38. if(a.lo != 0)
  39. return 0;
  40. if(a.hi == NANEXP)
  41. return sign >= 0;
  42. if(a.hi == (NANEXP|NANSIGN))
  43. return sign <= 0;
  44. return 0;
  45. }