nexttowardf.c 647 B

123456789101112131415161718192021222324252627282930313233343536
  1. #include "libm.h"
  2. float nexttowardf(float x, long double y)
  3. {
  4. union fshape ux;
  5. uint32_t e;
  6. if (isnan(x) || isnan(y))
  7. return x + y;
  8. if (x == y)
  9. return y;
  10. ux.value = x;
  11. if (x == 0) {
  12. ux.bits = 1;
  13. if (signbit(y))
  14. ux.bits |= 0x80000000;
  15. } else if (x < y) {
  16. if (signbit(x))
  17. ux.bits--;
  18. else
  19. ux.bits++;
  20. } else {
  21. if (signbit(x))
  22. ux.bits++;
  23. else
  24. ux.bits--;
  25. }
  26. e = ux.bits & 0x7f800000;
  27. /* raise overflow if ux.value is infinite and x is finite */
  28. if (e == 0x7f800000)
  29. return x + x;
  30. /* raise underflow if ux.value is subnormal or zero */
  31. if (e == 0)
  32. FORCE_EVAL(x*x + ux.value*ux.value);
  33. return ux.value;
  34. }