[osg-users] [osg-submissions] division by zero in osgParticle/FluidProgram.cpp

Csaba Halász csaba.halasz at gmail.com
Fri Mar 13 08:44:27 PDT 2009

On Fri, Mar 13, 2009 at 11:16 AM, Robert Osfield
<robert.osfield at gmail.com> wrote:
> Hi Csaba,
> Thanks for the fix. This helps me understand the nature and location
> of the problem.  Reviewing the changes and the original code I'm
> thinking it might be simpler to just refactor the code block so the
> division by wind_accel.length2() could be delayed, and have the if ()
> statement refactored by moving the divisor to the other side of the <
> expression :
>            double compenstated_dt = dt;
>            if (relative_wind.length2() < dt*dt*wind_accel.length2())
>            {
>                double critical_dt2 =
> relative_wind.length2()/wind_accel.length2();
>                osg::notify(osg::NOTICE)<<"** Could be critical:
> dt="<<dt<<" critical_dt="<<sqrtf(critical_dt2)<<std::endl;
>                compenstated_dt = sqrtf(critical_dt2)*0.8f;
>            }
> Does this change make sense to you?  If wind_accel.length2() is zero
> then the division will never take place, chances of an overflow should
> be avoided as well.

Hi Robert,
yeah, looks good. I have tried to come up with something similar, but
I didn't like my solution.
I wonder if the double calls to length2() get optimized by the
compiler, maybe it would be more efficient to store them in a
temporary variable. Also depends on how often the condition is true,
but shouldn't hurt.

> The changed file is attached, could you try this
> out on your models/app.  I've done the standard example tests here and
> they all work, but then they never highlighted a error so I can't
> confirm a fix.

This should definitely avoid the division by zero, as you say, but
since the problem only occurs randomly for us I can not directly
verify right away.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: FluidProgram.cpp
Type: text/x-c++src
Size: 2203 bytes
Desc: not available
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20090313/a35b2365/attachment-0003.cpp>

More information about the osg-users mailing list