Error handling

I’m evaluating a function at various values in a for loop. The
function works most of the times (99% of parameter range I am
investigating), but at some values, it gives error like below and
crushes. I guess something wrong with sqrt function. I’m not going to
attempt to show the function here because it is 1.5Mb. If I evaluate
the exact same function in Maple at the value it crushed in Ruby, it
behaves fine.

Is there any way that when the (sqrt) function crushes, it gives some
sort of error value and go on to evaluating at the next value without
crushing the program? I don’t want to manually restart the program at
the next value each time the program crushes. In R, there is "try"
function that can used for this kind of situation.

Thank you.

···

/usr/lib/ruby/1.6/complex.rb:82:in initialize': stack level too deep (SystemStackError) from /usr/lib/ruby/1.6/complex.rb:63:innew’
from /usr/lib/ruby/1.6/complex.rb:63:in Complex' from /usr/lib/ruby/1.6/complex.rb:130:in/'
from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt' from /usr/lib/ruby/1.6/mathn.rb:244:insqrt’
from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt' from /usr/lib/ruby/1.6/mathn.rb:244:insqrt’
from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt' ... 1461 levels... from rubyHopf0.rb:17:ineach’
from rubyHopf0.rb:17
from rubyHopf0.rb:16:in `each’
from rubyHopf0.rb:16

This looks like a bug… sqrt() is recursing too deeply here, 1461
levels seems a bit excessive. What values are causing it to dump like
that? Could you give a specific example?

Normally, you could catch an error like this:

begin
0 / 0
rescue
puts “no dividing by zero in integer division!”
end

… but that doesn’t work for me with a SystemStackError. I guess those
are always fatal errors.

–Mark

···

On Apr 1, 2004, at 8:29 AM, Phidippus wrote:

I’m evaluating a function at various values in a for loop. The
function works most of the times (99% of parameter range I am
investigating), but at some values, it gives error like below and
crushes. I guess something wrong with sqrt function. I’m not going to
attempt to show the function here because it is 1.5Mb. If I evaluate
the exact same function in Maple at the value it crushed in Ruby, it
behaves fine.

Is there any way that when the (sqrt) function crushes, it gives some
sort of error value and go on to evaluating at the next value without
crushing the program? I don’t want to manually restart the program at
the next value each time the program crushes. In R, there is “try”
function that can used for this kind of situation.

Thank you.

/usr/lib/ruby/1.6/complex.rb:82:in initialize': stack level too deep (SystemStackError) from /usr/lib/ruby/1.6/complex.rb:63:in new’
from /usr/lib/ruby/1.6/complex.rb:63:in Complex' from /usr/lib/ruby/1.6/complex.rb:130:in /’
from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt' from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt’
from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt' from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt’
from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt' ... 1461 levels... from rubyHopf0.rb:17:in each’
from rubyHopf0.rb:17
from rubyHopf0.rb:16:in `each’
from rubyHopf0.rb:16

I’m having hard time pinpointing where the error is generated since
there are so many places sqrt are used…

mopthisandthat@hotmail.com (Phidippus) wrote in message news:a2208ca9.0404010824.65538f9e@posting.google.com

···

I’m evaluating a function at various values in a for loop. The
function works most of the times (99% of parameter range I am
investigating), but at some values, it gives error like below and
crushes. I guess something wrong with sqrt function. I’m not going to
attempt to show the function here because it is 1.5Mb. If I evaluate
the exact same function in Maple at the value it crushed in Ruby, it
behaves fine.

Is there any way that when the (sqrt) function crushes, it gives some
sort of error value and go on to evaluating at the next value without
crushing the program? I don’t want to manually restart the program at
the next value each time the program crushes. In R, there is “try”
function that can used for this kind of situation.

Thank you.

/usr/lib/ruby/1.6/complex.rb:82:in initialize': stack level too deep (SystemStackError) from /usr/lib/ruby/1.6/complex.rb:63:in new’
from /usr/lib/ruby/1.6/complex.rb:63:in Complex' from /usr/lib/ruby/1.6/complex.rb:130:in /’
from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt' from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt’
from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt' from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt’
from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt' ... 1461 levels... from rubyHopf0.rb:17:in each’
from rubyHopf0.rb:17
from rubyHopf0.rb:16:in `each’
from rubyHopf0.rb:16

“Mark Hubbart” discord@mac.com schrieb im Newsbeitrag
news:789AB92E-83FE-11D8-97DE-000502FDD5CC@mac.com

I’m evaluating a function at various values in a for loop. The
function works most of the times (99% of parameter range I am
investigating), but at some values, it gives error like below and
crushes. I guess something wrong with sqrt function. I’m not going to
attempt to show the function here because it is 1.5Mb.

Are you serious? A single function with 1.5MB source code?

If I evaluate

the exact same function in Maple at the value it crushed in Ruby, it
behaves fine.

Well, you can’t compare Ruby with Maple on this: Maple is a math system
built to efficiency solve mathematical problems. Ruby is more of a general
purpose language and especially not very good at recursion. The stack
nesting problem surfaces every now and then.

AFAIK there is a compiler switch that you can employ during building of Ruby
that will increase the stack size. Alternatively you can implement sqrt as
iterative function yourself.

Is there any way that when the (sqrt) function crushes, it gives some
sort of error value and go on to evaluating at the next value without
crushing the program? I don’t want to manually restart the program at
the next value each time the program crushes. In R, there is “try”
function that can used for this kind of situation.

See below.

Thank you.

/usr/lib/ruby/1.6/complex.rb:82:in initialize': stack level too deep (SystemStackError) from /usr/lib/ruby/1.6/complex.rb:63:in new’
from /usr/lib/ruby/1.6/complex.rb:63:in Complex' from /usr/lib/ruby/1.6/complex.rb:130:in /’
from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt' from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt’
from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt' from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt’
from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt' ... 1461 levels... from rubyHopf0.rb:17:in each’
from rubyHopf0.rb:17
from rubyHopf0.rb:16:in `each’
from rubyHopf0.rb:16

This looks like a bug… sqrt() is recursing too deeply here, 1461
levels seems a bit excessive. What values are causing it to dump like
that? Could you give a specific example?

I guess they are quite big so sqrt needs to many steps to identify the
square root.

Normally, you could catch an error like this:

begin
0 / 0
rescue
puts “no dividing by zero in integer division!”
end

… but that doesn’t work for me with a SystemStackError. I guess those
are always fatal errors.

Works perfectly for me:

irb(main):036:0> def rec; rec; end
=> nil
irb(main):037:0> begin
irb(main):038:1* rec
irb(main):039:1> rescue SystemStackError => e
irb(main):040:1> puts “Caught it: #{e.inspect}”
irb(main):041:1> end
Caught it: #<SystemStackError: stack level too deep>
=> nil

Regards

robert
···

On Apr 1, 2004, at 8:29 AM, Phidippus wrote:

I don’t know if overloading Math.sqrt will help you?

Then you could log every time #sqrt is invoked.

···

On Sat, 03 Apr 2004 09:47:00 -0800, Phidippus wrote:

I’m having hard time pinpointing where the error is generated since
there are so many places sqrt are used…


Simon Strandgaard

“Mark Hubbart” discord@mac.com schrieb im Newsbeitrag
news:789AB92E-83FE-11D8-97DE-000502FDD5CC@mac.com

[…]

This looks like a bug… sqrt() is recursing too deeply here, 1461
levels seems a bit excessive. What values are causing it to dump like
that? Could you give a specific example?

I guess they are quite big so sqrt needs to many steps to identify the
square root.

Oh. I hadn’t realized that sqrt was supposed to recurse that much at
all… even using two 60 digit numbers to create a Complex number to
take the square root of, I couldn’t get sqrt to cause me any problems,
using 1.6.8…

Normally, you could catch an error like this:

begin
0 / 0
rescue
puts “no dividing by zero in integer division!”
end

… but that doesn’t work for me with a SystemStackError. I guess those
are always fatal errors.

Works perfectly for me:

irb(main):036:0> def rec; rec; end
=> nil
irb(main):037:0> begin
irb(main):038:1* rec
irb(main):039:1> rescue SystemStackError => e
irb(main):040:1> puts “Caught it: #{e.inspect}”
irb(main):041:1> end
Caught it: #<SystemStackError: stack level too deep>
=> nil

Okay, that’s kind of surprising. It works for me too, but only if I
specify the error type like in your code… I tried it the other time
in the same way as my example code above, and it failed. I thought that
if you didn’t specify the error type, it would catch anything;
apparently that’s not the case.

–Mark

···

On Apr 1, 2004, at 11:44 AM, Robert Klemme wrote:

Yes, one single function is 1.5Mb. It is rediculous, but true. I tried
whether the exact same function also works in R, and it worked fine.
But R is also developed for numerical computations, so it is probably
not a fair comparison for Ruby, I suppose.

“Robert Klemme” bob.news@gmx.net wrote in message news:c4hrb3$2i812u$1@ID-52924.news.uni-berlin.de

···

“Mark Hubbart” discord@mac.com schrieb im Newsbeitrag
news:789AB92E-83FE-11D8-97DE-000502FDD5CC@mac.com

On Apr 1, 2004, at 8:29 AM, Phidippus wrote:

I’m evaluating a function at various values in a for loop. The
function works most of the times (99% of parameter range I am
investigating), but at some values, it gives error like below and
crushes. I guess something wrong with sqrt function. I’m not going to
attempt to show the function here because it is 1.5Mb.

Are you serious? A single function with 1.5MB source code?

If I evaluate

the exact same function in Maple at the value it crushed in Ruby, it
behaves fine.

Well, you can’t compare Ruby with Maple on this: Maple is a math system
built to efficiency solve mathematical problems. Ruby is more of a general
purpose language and especially not very good at recursion. The stack
nesting problem surfaces every now and then.

AFAIK there is a compiler switch that you can employ during building of Ruby
that will increase the stack size. Alternatively you can implement sqrt as
iterative function yourself.

Is there any way that when the (sqrt) function crushes, it gives some
sort of error value and go on to evaluating at the next value without
crushing the program? I don’t want to manually restart the program at
the next value each time the program crushes. In R, there is “try”
function that can used for this kind of situation.

See below.

Thank you.

/usr/lib/ruby/1.6/complex.rb:82:in initialize': stack level too deep (SystemStackError) from /usr/lib/ruby/1.6/complex.rb:63:in new’
from /usr/lib/ruby/1.6/complex.rb:63:in Complex' from /usr/lib/ruby/1.6/complex.rb:130:in /’
from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt' from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt’
from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt' from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt’
from /usr/lib/ruby/1.6/mathn.rb:244:in sqrt' ... 1461 levels... from rubyHopf0.rb:17:in each’
from rubyHopf0.rb:17
from rubyHopf0.rb:16:in `each’
from rubyHopf0.rb:16

This looks like a bug… sqrt() is recursing too deeply here, 1461
levels seems a bit excessive. What values are causing it to dump like
that? Could you give a specific example?

I guess they are quite big so sqrt needs to many steps to identify the
square root.

Normally, you could catch an error like this:

begin
0 / 0
rescue
puts “no dividing by zero in integer division!”
end

… but that doesn’t work for me with a SystemStackError. I guess those
are always fatal errors.

Works perfectly for me:

irb(main):036:0> def rec; rec; end
=> nil
irb(main):037:0> begin
irb(main):038:1* rec
irb(main):039:1> rescue SystemStackError => e
irb(main):040:1> puts “Caught it: #{e.inspect}”
irb(main):041:1> end
Caught it: #<SystemStackError: stack level too deep>
=> nil

Regards

robert

“Mark Hubbart” discord@mac.com schrieb im Newsbeitrag
news:82DA4958-8456-11D8-97DE-000502FDD5CC@mac.com

“Mark Hubbart” discord@mac.com schrieb im Newsbeitrag
news:789AB92E-83FE-11D8-97DE-000502FDD5CC@mac.com

[…]

This looks like a bug… sqrt() is recursing too deeply here, 1461
levels seems a bit excessive. What values are causing it to dump like
that? Could you give a specific example?

I guess they are quite big so sqrt needs to many steps to identify the
square root.

Oh. I hadn’t realized that sqrt was supposed to recurse that much at
all… even using two 60 digit numbers to create a Complex number to
take the square root of, I couldn’t get sqrt to cause me any problems,
using 1.6.8…

That was just a wild guess. I’d normally not expect sqrt to be written as
recursive function at all. But the stacktrace seemed to indicate that.

Normally, you could catch an error like this:

begin
0 / 0
rescue
puts “no dividing by zero in integer division!”
end

… but that doesn’t work for me with a SystemStackError. I guess
those
are always fatal errors.

Works perfectly for me:

irb(main):036:0> def rec; rec; end
=> nil
irb(main):037:0> begin
irb(main):038:1* rec
irb(main):039:1> rescue SystemStackError => e
irb(main):040:1> puts “Caught it: #{e.inspect}”
irb(main):041:1> end
Caught it: #<SystemStackError: stack level too deep>
=> nil

Okay, that’s kind of surprising. It works for me too, but only if I
specify the error type like in your code… I tried it the other time
in the same way as my example code above, and it failed. I thought that
if you didn’t specify the error type, it would catch anything;

I thought that once, too. But I got wiser in the meantime. :slight_smile:

apparently that’s not the case.

“If you write a rescue clause with no parameter list, the parameter
defaults to StandardError.”
http://www.rubycentral.com/book/tut_exceptions.html

Regards

robert
···

On Apr 1, 2004, at 11:44 AM, Robert Klemme wrote:

“Phidippus” mopthisandthat@hotmail.com schrieb im Newsbeitrag
news:a2208ca9.0404030853.769a5e67@posting.google.com

Yes, one single function is 1.5Mb. It is rediculous, but true. I tried
whether the exact same function also works in R, and it worked fine.
But R is also developed for numerical computations, so it is probably
not a fair comparison for Ruby, I suppose.

Whatever language is used, 1.5 GB source code for a single function is
definitely too much. Some systems might gracefully deal with it, but what
about human maintainers? IMHO heavy refactoring is indicated.

Regards

robert