Project

General

Profile

Actions

Feature #2347

closed

Math::INFINITY

Added by marcandre (Marc-Andre Lafortune) over 14 years ago. Updated over 11 years ago.

Status:
Closed
Target version:
[ruby-core:26632]

Description

=begin
It is easy to get an infinity in Ruby (ex: 1.0/0) but that may not be obvious to everyone.

Could we have Math::INFINITY which would make code using it cleaner?

Thanks

diff --git a/math.c b/math.c
index 51caf35..653a239 100644
--- a/math.c
+++ b/math.c
@@ -764,6 +764,7 @@ Init_Math(void)
#else
rb_define_const(rb_mMath, "E", DBL2NUM(exp(1.0)));
#endif

  • rb_define_const(rb_mMath, "INFINITY", DBL2NUM(1.0/0.0));

    rb_define_module_function(rb_mMath, "atan2", math_atan2, 2);
    rb_define_module_function(rb_mMath, "cos", math_cos, 1);
    =end

Actions #1

Updated by yugui (Yuki Sonoda) over 14 years ago

=begin
2009/11/9 Marc-Andre Lafortune :

It is easy to get an infinity in Ruby (ex: 1.0/0) but that may not be obvious to everyone.

Could we have Math::INFINITY which would make code using it cleaner?

As my understand, Ruby has not had Math::INFINITY because C does not have it.
Introducing infinity might decrease portability of Ruby. But I think
actually it is not a problem.

Now Ruby assumes the environment has native threading and US-ASCII
compatible locale.
Here are a problem. Is there an environment which satisfies the
conditions but does not have infinity?

Thanks,
-- Yuki Sonoda (Yugui)

=end

Actions #2

Updated by yugui (Yuki Sonoda) over 14 years ago

=begin
2009/11/9 Tanaka Akira :

Here are a problem. Is there an environment which satisfies the
conditions but does not have infinity?

NetBSD on VAX, I guess.

VAX!

OK. I understand. I'm against for introducing Math::INFINITY.

-- Yuki Sonoda (Yugui)

=end

Actions #3

Updated by usa (Usaku NAKAMURA) over 14 years ago

=begin
Hello,

In message "[ruby-core:26632] [Feature #2347] Math::INFINITY"
on Nov.09,2009 04:53:15, wrote:

  • rb_define_const(rb_mMath, "INFINITY", DBL2NUM(1.0/0.0));

FYI, some strict compilers doesn't permit to divide by zero
literal.

Regards,

U.Nakamura

=end

Actions #4

Updated by shugo (Shugo Maeda) over 14 years ago

=begin
Hi,

2009/11/9 Yugui :

Could we have Math::INFINITY which would make code using it cleaner?

As my understand, Ruby has not had Math::INFINITY because C does not have it.
Introducing infinity might decrease portability of Ruby. But I think
actually it is not a problem.

I proposed Float::INFINITY in [ruby-list:7023], and it was discussed
in the thread
and a thread from [ruby-dev:1657]. 1.0 / 0.0 now produces an
infinity, but it raised
ZeroDivisionError at that time.

I don't remember the reason why Float::INFINITY was rejected, but we
have already
Float#infinite?, so Math::INFINITY or Float::INFINITY which are
provided only on the
platform supportng IEEE 754 may not be so bad.

Apart from portability issues, someone proposed a class whose instance
represents
a mathematical infinity at that time, not a IEEE 754 infinity. It may
be worth considering.

--
Shugo Maeda

=end

Actions #5

Updated by matz (Yukihiro Matsumoto) over 14 years ago

=begin
Hi,

In message "Re: [ruby-core:26644] Re: [Feature #2347] Math::INFINITY"
on Mon, 9 Nov 2009 12:17:41 +0900, Shugo Maeda writes:

|I don't remember the reason why Float::INFINITY was rejected, but we
|have already Float#infinite?

It's not because infinity is not defined by Ruby's number system, but
because there's no portable way to generate infinity from C. 1.0/0.0
may not be compiled on some compiler.

						matz.

=end

Actions #6

Updated by marcandre (Marc-Andre Lafortune) over 14 years ago

=begin
I'm quite ignorant about the differences between compilers and implementations (and I wouldn't mind remaining this way! ;-)

The fact is, Ruby already generates infinities. Line 2471 of numeric.c:

#define infinite_value() ruby_div0(1.0)

It's used in fix_pow.

I think there is a C macro called INFINITY also:
http://www.gnu.org/software/libtool/manual/libc/Infinity-and-NaN.html

If it is still an imperative that Ruby supports non IEEE architectures, then maybe that constant could be conditional on that?

I do not want to judge the decision to support an old platforms or not. I think it would be sad if Ruby was kept back because of supporting them though.
=end

Actions #7

Updated by shugo (Shugo Maeda) over 14 years ago

=begin
Hi,

2009/11/10 Marc-Andre Lafortune :

I'm quite ignorant about the differences between compilers and implementations (and I wouldn't mind remaining this way! ;-)

The fact is, Ruby already generates infinities. Line 2471 of numeric.c:

#define infinite_value() ruby_div0(1.0)

FYI, I heard that some compilers doesn't permit zero divisions by
literals, but the following
code can be used to avoid the check:

tmp = 1.0;
inf = 1.0 / (tmp - tmp);

GNU Octave has more complicated code to generate an infinity:

     volatile double tmp_inf;

#if defined (SCO)
volatile double tmp = 1.0;
tmp_inf = 1.0 / (tmp - tmp);
#elif defined (alpha) && defined (osf)
extern unsigned int DINFINITY[2];
tmp_inf = (*(X_CAST(double *, DINFINITY)));
#else
double tmp = 1e+10;
tmp_inf = tmp;
for (;;)
{
tmp_inf *= 1e+10;
if (tmp_inf == tmp)
break;
tmp = tmp_inf;
}

--
Shugo Maeda

=end

Actions #8

Updated by ujihisa (Tatsuhiro Ujihisa) over 14 years ago

  • Status changed from Open to Assigned

=begin

=end

Actions #9

Updated by naruse (Yui NARUSE) over 14 years ago

  • Priority changed from Normal to 3

=begin

=end

Actions #10

Updated by naruse (Yui NARUSE) about 14 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

=begin
This issue was solved with changeset r26197.
Marc-Andre, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

=end

Updated by rubydev (Adam Carpenter) over 11 years ago

naruse (Yui NARUSE) wrote:

=begin
This issue was solved with changeset r26197.
Marc-Andre, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

=end
thank you Marc for figuring out this bug - helpful code
~Adam
http://ville-web.ch

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0