int scheme_is_zero(const Scheme_Object *o) { Scheme_Type t; if (SCHEME_INTP(o)) return o == zeroi; t = _SCHEME_TYPE(o); #ifdef MZ_USE_SINGLE_FLOATS if (t == scheme_float_type) { # ifdef NAN_EQUALS_ANYTHING if (MZ_IS_NAN(SCHEME_FLT_VAL(o))) return 0; # endif return SCHEME_FLT_VAL(o) == 0.0f; } #endif if (t == scheme_double_type) { #ifdef NAN_EQUALS_ANYTHING if (MZ_IS_NAN(SCHEME_DBL_VAL(o))) return 0; #endif return SCHEME_DBL_VAL(o) == 0.0; } if (t == scheme_complex_type) { if (scheme_is_zero(scheme_complex_imaginary_part(o))) return scheme_is_zero(scheme_complex_real_part(o)); return 0; } if ((t >= scheme_bignum_type) && (t <= scheme_complex_type)) return 0; return -1; }
XFORM_NONGCING static MZ_INLINE int double_eqv(double a, double b) { # ifndef NAN_EQUALS_ANYTHING if (a != b) { # endif /* Double-check for NANs: */ if (MZ_IS_NAN(a)) { if (MZ_IS_NAN(b)) return 1; # ifdef NAN_EQUALS_ANYTHING return 0; # endif } # ifdef NAN_EQUALS_ANYTHING if (MZ_IS_NAN(b)) return 0; else { if (a == 0.0) { if (b == 0.0) { return scheme_minus_zero_p(a) == scheme_minus_zero_p(b); } } return (a == b); } # else return 0; } if (a == 0.0) { if (b == 0.0) { return scheme_minus_zero_p(a) == scheme_minus_zero_p(b); } } return 1; # endif }