Bug #9170
closedMath.sqrt returns different types when mathn is included; breaks various gems - this bug can be reproduced in Ruby 1.8 as well
Description
Math.sqrt() usually returns a Float or throws an exception. Some gems rely on this behaviour (e.g. by calling nan? on the results of a calculation that includes a sqrt).
After requiring mathn, Math.sqrt() returns an Integer in some cases (when the results of the sqrt would be a whole number).
Here is a transcript that demonstrates the problem:
$ rvm use ree
Using /Users/jason/.rvm/gems/ree-1.8.7-2012.02
$ ruby -v
ruby 1.8.7 (2012-02-08 MBARI 8/0x6770 on patchlevel 358) [i686-darwin12.1.0], MBARI 0x6770, Ruby Enterprise Edition 2012.02
$ ruby -e "puts Math.sqrt(4).nan?"
false
$ ruby -e "require 'mathn'; puts Math.sqrt(4).nan?"
-e:1: undefined method nan?' for 2:Fixnum (NoMethodError) $ rvm use 1.9.3 Using /Users/jason/.rvm/gems/ruby-1.9.3-p448 $ ruby -v ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-darwin12.2.0] $ ruby -e "puts Math.sqrt(4).nan?" false $ ruby -e "require 'mathn'; puts Math.sqrt(4).nan?" -e:1:in
': undefined method nan?' for 2:Fixnum (NoMethodError) $ rvm use 2.0 Using /Users/jason/.rvm/gems/ruby-2.0.0-p247 $ ruby -v ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.2.1] $ ruby -e "puts Math.sqrt(4).nan?" false $ ruby -e "require 'mathn'; puts Math.sqrt(4).nan?" -e:1:in
': undefined method nan?' for 2:Fixnum (NoMethodError) $ rvm use jruby Using /Users/jason/.rvm/gems/jruby-1.7.4 $ ruby -v jruby 1.7.4 (1.9.3p392) 2013-05-16 2390d3b on Java HotSpot(TM) 64-Bit Server VM 1.6.0_51-b11-457-11M4509 [darwin-x86_64] $ ruby -e "puts Math.sqrt(4).nan?" false $ ruby -e "require 'mathn'; puts Math.sqrt(4).nan?" NoMethodError: undefined method
nan?' for 2:Fixnum
(root) at -e:1
Here is a discussion of how the bug manifests itself: https://github.com/olbrich/ruby-units/pull/48
Inclusion of mathn causes issues in RGeo, Alchemist, ActiveShipping and pry-rails
Updated by mrkn (Kenta Murata) over 10 years ago
- Category set to core
- Status changed from Open to Feedback
- Target version set to 2.6
It's not a bug.
Do you want to introduce Numeric#nan? method to resolve this problem?
If so, this issue should be in Feature tracker.
Please tell us how do you think.
Updated by mrkn (Kenta Murata) over 10 years ago
I think introducing Numeric#nan? is good.
Updated by kranzky (Jason Hutchens) over 10 years ago
mrkn (Kenta Murata) wrote:
It's not a bug.
I'm a middle-man here, but I have gem maintainers claiming that it is a bug, because the documentation for Math.sqrt() indicates that it returns a Float, and that it's therefore OK to assume that it can be treated as a Float by the caller. Ref: http://ruby-doc.org/core-2.1.0/Math.html#method-c-sqrt
Updated by marcandre (Marc-Andre Lafortune) over 10 years ago
Isn't this more an issue with the documentation of mathn
not specifying all the methods it changes and how?
It might be wise to add a warning that it is suggested not to require it from a library because it might induce unexpected changes in any code using it?
It would be a prime candidate for refinements...
Updated by zzak (zzak _) over 10 years ago
I will check the docs and see if I can fix it.
On Jan 6, 2014, at 12:44 AM, "kranzky (Jason Hutchens)" JasonHutchens@gmail.com wrote:
Issue #9170 has been updated by kranzky (Jason Hutchens).
mrkn (Kenta Murata) wrote:
It's not a bug.
I'm a middle-man here, but I have gem maintainers claiming that it is a bug, because the documentation for Math.sqrt() indicates that it returns a Float, and that it's therefore OK to assume that it can be treated as a Float by the caller. Ref: http://ruby-doc.org/core-2.1.0/Math.html#method-c-sqrt
Bug #9170: Math.sqrt returns different types when mathn is included; breaks various gems - this bug can be reproduced in Ruby 1.8 as well
https://bugs.ruby-lang.org/issues/9170#change-44105Author: kranzky (Jason Hutchens)
Status: Feedback
Priority: Normal
Assignee:
Category: core
Target version: next minor
ruby -v: ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.2.1]
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWNMath.sqrt() usually returns a Float or throws an exception. Some gems rely on this behaviour (e.g. by calling nan? on the results of a calculation that includes a sqrt).
After requiring mathn, Math.sqrt() returns an Integer in some cases (when the results of the sqrt would be a whole number).
Here is a transcript that demonstrates the problem:
$ rvm use ree
Using /Users/jason/.rvm/gems/ree-1.8.7-2012.02
$ ruby -v
ruby 1.8.7 (2012-02-08 MBARI 8/0x6770 on patchlevel 358) [i686-darwin12.1.0], MBARI 0x6770, Ruby Enterprise Edition 2012.02
$ ruby -e "puts Math.sqrt(4).nan?"
false
$ ruby -e "require 'mathn'; puts Math.sqrt(4).nan?"
-e:1: undefined methodnan?' for 2:Fixnum (NoMethodError) $ rvm use 1.9.3 Using /Users/jason/.rvm/gems/ruby-1.9.3-p448 $ ruby -v ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-darwin12.2.0] $ ruby -e "puts Math.sqrt(4).nan?" false $ ruby -e "require 'mathn'; puts Math.sqrt(4).nan?" -e:1:in
': undefined methodnan?' for 2:Fixnum (NoMethodError) $ rvm use 2.0 Using /Users/jason/.rvm/gems/ruby-2.0.0-p247 $ ruby -v ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.2.1] $ ruby -e "puts Math.sqrt(4).nan?" false $ ruby -e "require 'mathn'; puts Math.sqrt(4).nan?" -e:1:in
': undefined methodnan?' for 2:Fixnum (NoMethodError) $ rvm use jruby Using /Users/jason/.rvm/gems/jruby-1.7.4 $ ruby -v jruby 1.7.4 (1.9.3p392) 2013-05-16 2390d3b on Java HotSpot(TM) 64-Bit Server VM 1.6.0_51-b11-457-11M4509 [darwin-x86_64] $ ruby -e "puts Math.sqrt(4).nan?" false $ ruby -e "require 'mathn'; puts Math.sqrt(4).nan?" NoMethodError: undefined method
nan?' for 2:Fixnum
(root) at -e:1Here is a discussion of how the bug manifests itself: https://github.com/olbrich/ruby-units/pull/48
Inclusion of mathn causes issues in RGeo, Alchemist, ActiveShipping and pry-rails
Updated by jeremyevans0 (Jeremy Evans) almost 5 years ago
- Status changed from Feedback to Closed
- Backport deleted (
1.9.3: UNKNOWN, 2.0.0: UNKNOWN)
mathn was removed from the standard library in Ruby 2.5.