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);