Speed optimisation

Alex Tweedly alex at tweedly.net
Fri Oct 7 07:06:26 EDT 2005


Dick Kriesel wrote:

>On 10/6/05 4:21 AM, "Alex Tweedly" <alex at tweedly.net> wrote:
>
>  
>
>>Hmmm - can you give a case where Kay's method gives wrong answers
>>because of a negative seconds value ?
>>As far as I can see (both by inspection and by testing) it always gets
>>it right.
>>    
>>
> 
>Whenever the negative seconds cause the result to be negative, the result is
>wrong.  For example, "00:01:00.5",-61 gives 23:59:59.5. 
>
But that's the right answer !
00:01:00.5 represents 60.5 seconds after midnight. Subtract 61 seconds 
and you should get .6 seconds before midnight - i.e. 23:59:59.5

> But even if the
>convert function didn't cause a wrap-around, the result would be wrong,
>because the decimal digit is appended without checking the sign. The
>function would compute (60-61)&.5 = -1.5 seconds, instead of -.5 seconds.
>  
>
There's no need to check a sign here. Any fractional part of a second in 
the original time value is always positive; so you always want to add 
it. Since the result is also always positive (it uses wrap-around rather 
than return negative times), the positive fractional part should always 
be added.

In the case you mention, (60-61)&.5 doesn't give -1.5, what it gives is 
the wrapped version, i.e. (something:59)&.5


>>On the other hand, both your method and mine (which is really just a
>>variant of yours) get it wrong in key cases of negative seconds (e.g.
>>00:00:00.1   - 31 gives   0:00:0-31 for you and 0:00:0-31.0 for me -
>>both rather hopeless :-)
>>    
>>
>
>So I'm glad I wasn't throwing any stones.  Here's a new version that handles
>negative seconds and negative results correctly (I think):
>
>  
>
No, it doesn't I'm afraid.
 00:00:00.0 - 31 gives a wrong answer.

You can fix that with an extra if test to put in a sign if the whole 
tSeconds is negative. But once you've done that, even using the "format" 
variant for its speed, it's slower than Kay's version using twelvehourtime.

Rob indicated in another email that they could change the spec to allow 
wrap-around within the 24-hour space.

So *if* Rob can accept the missing trailing "0" then Kay is the "winner 
apparent" for the QP (pending any other faster method).

>function addTimeAndSeconds pTime,pSeconds
>  set the itemDelimiter to ":"
>  put item 1 of pTime * 3600 + item 2 of pTime * 60 + item 3 of pTime \
>    + pSeconds into tSeconds
>  put tSeconds div 3600 & ":" & abs(tSeconds) mod 3600 div 60 & ":" \
>    & abs(tSeconds) mod 60 into tTime
>  if item 2 of tTime < 10 then put 0 before item 2 of tTime
>  if item 3 of tTime < 10 then put 0 before item 3 of tTime
>  return tTime
>end addTimeAndSeconds
>
>The new version runs faster than my old, invalid version, oddly enough.
>
>I wonder if Rob still cares...
>
>-- Dick
>
>
>_______________________________________________
>use-revolution mailing list
>use-revolution at lists.runrev.com
>Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
>http://lists.runrev.com/mailman/listinfo/use-revolution
>
>
>  
>


-- 
Alex Tweedly       http://www.tweedly.net

-------------- next part --------------
No virus found in this outgoing message.
Checked by AVG Anti-Virus.
Version: 7.0.344 / Virus Database: 267.11.13/123 - Release Date: 06/10/2005


More information about the use-livecode mailing list