I'm pretty sure there's a bug in the way ChucK prints time. Or there may be a bug in the way I think. Bear with me... You would expect that two time values that print identically would compare as equal. But I can show you a case where t0 and t1 print as "44100.000000" yet they're not equal. You'd also expect t1 to have a fractional part of 0.0. But in this case: <<< (t1 % 1::second) >>> prints "1.000000" and <<< t1 - (t1 % 1::second) >>> prints "44099.000000" Mind you, I'm NOT complaining about roundoff error -- I understand that converting between floats and time is subject to roundoff -- but it has certainly cost me a LOT of debugging time discovering that 44100.000000 != 44100.000000. It's a printing bug. Here's the code. It's longer than it needs to be, so if anyone asks for it, I'll strip it down to a three line example. // In ChucK, two times can appear to be equal when printed, // but compare as not equal, as demonstrated here. 72.511111111 => float tempo; // intentionally subject to roundoff now => time t0; // base time 100.0 => float b0; // beat at t0 1::second / tempo => dur i0; // duration of one beat // convert from system time to beat fun float time_to_beat(time t) { return b0 + (t - t0)/i0; } // convert from beat to system time fun time beat_to_time(float b) { return t0 + (b - b0)::i0; } // for debugging: extract fractional and whole parts from time fun dur frac_time(time t) { return t % 1::samp; } fun time whol_time(time t) { return t - (t % 1::samp); } fun void test_time(time t0) { beat_to_time(time_to_beat(t0)) => time t1; if (t0 != t1) { <<< "t0:",t0,"is not equal to t1:",t1>>>; frac_time(t0) => dur f0; frac_time(t1) => dur f1; whol_time(t0) => time w0; whol_time(t1) => time w1; <<< f0, f1, f0==f1, w0, w1, w0==w1 >>>; } } test_time(now); test_time(now+1::second); test_time(now+1::samp);
2009/10/14 Robert Poor
You would expect that two time values that print identically would compare as equal. But I can show you a case where t0 and t1 print as "44100.000000" yet they're not equal. You'd also expect t1 to have a fractional part of 0.0. But in this case:
<<< (t1 % 1::second) >>> prints "1.000000"
and
<<< t1 - (t1 % 1::second) >>> prints "44099.000000"
You could always use (t0 + "") == (t1 + ""). tongue =< cheek; I never expect that two floats can be equal, except, on rare occasions, zeroes. -- Tom Lieber http://AllTom.com/
participants (2)
-
Robert Poor
-
Tom Lieber