From: Joe Neeman Date: Fri, 13 Jul 2007 00:23:33 +0000 (+1000) Subject: more robustness to inf and nan in simple-spacer and spring X-Git-Tag: release/2.11.28-1~14^2~8 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=6fa1029a4b2cba0847e17b30c1a8b650a09e5b97;p=lilypond.git more robustness to inf and nan in simple-spacer and spring --- diff --git a/lily/simple-spacer.cc b/lily/simple-spacer.cc index 8e0722438e..fcad2f18c1 100644 --- a/lily/simple-spacer.cc +++ b/lily/simple-spacer.cc @@ -83,6 +83,9 @@ Simple_spacer::rod_force (int l, int r, Real dist) Real d = range_ideal_len (l, r); Real c = range_stiffness (l, r, dist > d); Real block_stretch = dist - d; + + if (isinf (c)) /* take care of the 0*infinity_f case */ + return 0; return c * block_stretch; } @@ -167,6 +170,9 @@ Simple_spacer::expand_line () for (vsize i=0; i < springs_.size (); i++) inv_hooke += springs_[i].inverse_stretch_strength (); + if (inv_hooke == 0.0) /* avoid division by zero. If springs are infinitely stiff */ + return 0.0; /* anyway, then it makes no difference what the force is */ + assert (cur_len <= line_len_); return (line_len_ - cur_len) / inv_hooke + force_; } diff --git a/lily/spring.cc b/lily/spring.cc index 679ccfa29d..c9f3afbe42 100644 --- a/lily/spring.cc +++ b/lily/spring.cc @@ -152,5 +152,12 @@ Spring::length (Real f) const { Real force = max (f, blocking_force_); Real inv_k = force < 0.0 ? inverse_compress_strength_ : inverse_stretch_strength_; + + if (isinf (force)) + { + programming_error ("cruelty to springs"); + force = 0.0; + } + return distance_ + force * inv_k; }