From: mopthisandthat@... (Phidippus) Date: 2004-04-04T01:54:36+09:00 Subject: Re: error handling 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" wrote in message news:... > "Mark Hubbart" 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: # > => nil > > Regards > > robert