error handling

P

Phidippus

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
 
M

Mark Hubbart

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

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
 
R

Robert Klemme

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

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.

See below.
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
 
M

Mark Hubbart

[...]
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...
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
 
R

Robert Klemme

Mark Hubbart said:
[...]
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.
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. :)
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
 
P

Phidippus

I'm having hard time pinpointing where the error is generated since
there are so many places sqrt are used...
 
S

Simon Strandgaard

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

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

Then you could log every time #sqrt is invoked.
 
P

Phidippus

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.
 
R

Robert Klemme

Phidippus said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top