In a for-loop, I’m integrating with respect to time with constant, fractional time step, dt. I only want to save the simulation results for integral (finite ordinal) time points. My solution is as follows,
dt = 0.1
steps = 100
for step in range(steps):
if (step*dt) % 1 == 0.0:
print step
I’ve never really trusted modular arithmetic on floats. Is there a better way to check if a float is integral or am I simply being paranoid?
This is dangerous, in any programming language.
In your example,. In many cases, the step size may not have an exact representation in floating-point, so that the accumulated rounding error causes the test to erroneously trigger/not trigger. In other cases, as the accumulated value gets larger, eventually it will begin to lose precision due to the increasing exponent (in your example, assuming Python uses single-precision by default, you’ll get an erroneous trigger after 20971529 iterations).0.1cannot be represented exactly by in floating-point, so that test will never pass (well I suppose it may do after 2^24 iterations or so)Try to find a way to avoid performing equality tests on floating-point values (checking for integral values is one such test). So in your case, just test on
step % 10.