/me drools I have GOT to see this code Dave! On 9/21/07, Dave Smith <[EMAIL PROTECTED]> wrote: > Steve wrote: > > Since the sprintf function is slowing down on the log10 due to > > floating point arithmetic, I wonder if a further optimization could be > > made by rewriting the log10 function in assembler to take advantage of > > the floating point registers? > > > > I found that writing an integer-based log10 function sped up my itoa > function considerably. I don't think you could do anything faster in > ASM, especially since floating point math is not strictly required anyway. > > Anyway, I revised my implementation today to not *need* a log10 function > by writing the ascii value into the *end* of the buffer, right-to-left, > least-significant to most-significant, and then it returns a pointer to > the beginning of the ascii string it creates. That way, I didn't need to > calculate the length of the string up front (or ever), and it cut my > runtime in half. > > I did, however, find another special case (in addition to zero), and > that is INT_MIN. If you can figure out why INT_MIN is a special case, > you get bonus Plug Karma points. The answer lies in the result of the > following C expression: > > abs( INT_MIN ); // What does this return? :) > > (Note: you'll need to include <limits.h> and <stdlib.h>) > > I found this special case by running 2^32 test cases for every 32 bit > integer, and 48 minutes later, it reported that it passes (ie, returns > the same as sprintf()) for all 2^32 values. Also, my code performed > about 3.3 million itoa()'s per second. Not too shabby. :) > > I wonder how Java would do, and Qt's QString::number() for that matter. > > --Dave > > /* > PLUG: http://plug.org, #utah on irc.freenode.net > Unsubscribe: http://plug.org/mailman/options/plug > Don't fear the penguin. > */ >
/* PLUG: http://plug.org, #utah on irc.freenode.net Unsubscribe: http://plug.org/mailman/options/plug Don't fear the penguin. */
