nan-thumb.c 717 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include <lib9.h>
  2. #define NANEXP (2047<<20)
  3. #define NANMASK (2047<<20)
  4. #define NANSIGN (1<<31)
  5. double
  6. NaN(void)
  7. {
  8. union
  9. {
  10. double d;
  11. long x[2];
  12. } a;
  13. a.x[0] = NANEXP;
  14. a.x[1] = 1;
  15. return a.d;
  16. }
  17. int
  18. isNaN(double d)
  19. {
  20. union
  21. {
  22. double d;
  23. long x[2];
  24. } a;
  25. a.d = d;
  26. if((a.x[0] & NANMASK) != NANEXP)
  27. return 0;
  28. return !isInf(d, 0);
  29. }
  30. double
  31. Inf(int sign)
  32. {
  33. union
  34. {
  35. double d;
  36. long x[2];
  37. } a;
  38. a.x[0] = NANEXP;
  39. a.x[1] = 0;
  40. if(sign < 0)
  41. a.x[0] |= NANSIGN;
  42. return a.d;
  43. }
  44. int
  45. isInf(double d, int sign)
  46. {
  47. union
  48. {
  49. double d;
  50. long x[2];
  51. } a;
  52. a.d = d;
  53. if(a.x[1] != 0)
  54. return 0;
  55. if(a.x[0] == NANEXP)
  56. return sign >= 0;
  57. if(a.x[0] == (NANEXP|NANSIGN))
  58. return sign <= 0;
  59. return 0;
  60. }