Feature #12039
closedFixnum#infinite?/Bignum#infinite or Numeric#infinte, consistent with Float#infinite? and BigDecimal#infinite?
Description
We have an issue where it is not easy to ask if a number is +ve or -ve infinity. https://github.com/rails/arel/issues/411
Both Float and BigDecimal do respond to infinite? but Integer derivatives don't. It sort of makes sense, since we don't have an infinity value for Fixnum/Bignum. However, it makes polymorphic code hard.
[13] pry(main)> Float::INFINITY.infinite?
=> 1
[14] pry(main)> -Float::INFINITY.infinite?
=> -1
[15] pry(main)> BigDecimal::INFINITY.infinite?
=> 1
[16] pry(main)> -BigDecimal::INFINITY.infinite?
=> -1
Given a Numeric value x, it would be nice to query if it is INFINITY or not. Propose adding a default implementation to Numeric, which always returns false or nil.
Updated by ioquatix (Samuel Williams) almost 10 years ago
It might also make sense to consider if other "predicates" make sense, e.g. nan? They should be declared on Numeric with a default logical implementation where possible.
Updated by seantheprogrammer (Sean Griffin) almost 10 years ago
This is probably a useful method to be able to rely on universally, even if Fixnum and Bignum just return false.
Updated by shyouhei (Shyouhei Urabe) over 9 years ago
Another real-world use-case where I found Numeric#infinite? useful is JSON validation. Infinities are not allowed in JSON so a programmer want to filter them out before converting a Numeric into JSON, but that is not straight-forward right now. With this method it becomes much OO-ish.
Updated by matz (Yukihiro Matsumoto) over 9 years ago
Agreed. Add #finite? and #infinite?
Matz.
Updated by nobu (Nobuyoshi Nakada) over 9 years ago
- Tracker changed from Bug to Feature
Updated by mrkn (Kenta Murata) over 9 years ago
What behavior is desirable for a Complex?
Updated by mrkn (Kenta Murata) over 9 years ago
I think the following definition is acceptable for a Complex:
def inifinite?
self.magnitude.infinite?
end
Updated by ioquatix (Samuel Williams) over 9 years ago
This looks good, do you think we can integrate this at some point? What do we need to do?
Updated by mrkn (Kenta Murata) over 9 years ago
- Assignee set to mrkn (Kenta Murata)
Updated by mrkn (Kenta Murata) over 9 years ago
- Status changed from Open to Closed
Applied in changeset r55702.
numeric.c, complex.c: Add finite? and infinite? consistent with Float
-
numeric.c (num_finite_p, num_infinite_p): Add Numeric#finite? and
Numeric#infinite? [Feature #12039] [ruby-core:73618] -
complex.c (rb_complex_finite_p): Add Complex#finite?
-
complex.c (rb_complex_infinite_p): Add Complex#infinite?
-
test/ruby/test_bignum.rb: Add test for Integer#finite? and
Integer#infinite? -
test/ruby/test_fixnum.rb: ditto.
-
test/ruby/test_rational.rb: Add test for Rational#finite? and
Rational#infinite? -
test/ruby/test_complex.rb: Add test for Complex#finite? and
Complex#infinite?
Updated by ioquatix (Samuel Williams) about 9 years ago
Thank you for your hard work :)
Updated by shyouhei (Shyouhei Urabe) almost 9 years ago
- Related to Feature #10641: Introduce Fixnum#finite? and Bignum#finite? added