Is 0.000001 as small a number as can be worked with?
Geoff Canyon
gcanyon at gmail.com
Thu Dec 5 08:56:25 EST 2013
Nice, thanks! I did something very similar about two days ago, except that,
since I thought LC wouldn't handle more than 6 digits of precision to the
right of the decimal point, I allowed for mantissas up to 10^7 (so that
multiplication would not overflow the standard math/numeric * function. It
turned out to be something like 100x slower than simple * which is perhaps
understandable, but given that I'm talking about doing gravity for (at
least) all the round bodies in the solar system (50 or so) for each update,
I gave it up for a different method.
You definitely need a bounds check so
*put* SciFormAdd("1,23","1,-10")
1.,23
*put* SciFormAdd("1,-10","1,23")
9.99999999999999945575230987042816,22
doesn't happen.
On Thu, Dec 5, 2013 at 4:17 AM, Michael Julian Lew
<michaell at unimelb.edu.au>wrote:
> Ages ago I wrote some functions to allow arithmetic with arbitrarily large
> numbers of decimal places. (I think I debugged them, but it was a while ago
> so you should check them carefully!)
>
> function SciForm x
> --Returns the number in the form signed mantissa, comma, power of ten
> put empty into tsign
> if char 1 of x = "-" then
> delete char 1 of x
> put "-" into tsign
> end if
> if char 1 of x = "+" then delete char 1 of x
> --leading zeros
> repeat
> if char 1 of x <> "0" then exit repeat
> delete char 1 of x
> end repeat
> if x is empty then
> --value was zero!
> return "0,0"
> exit SciForm
> end if
> if "." is not in x then
> put (the number of chars in x) -1 into tpower
> put "." after char 1 of x
> put x into tmant
> else --contains .
> if char 1 of x = "." then --decimal leading
> replace "." with empty in x
> put x into x2
> put x into tmant
> put "." after char 1 of tmant
> put 0 into leadZeros
> repeat
> if char 1 of x2 <> "0" then exit repeat
> delete char 1 of x2
> add 1 to leadZeros
> end repeat
> if x2 is empty then
> --value was zero!
> return "0,0"
> exit SciForm
> end if
> put the number of chars in x2- the number of chars in x -1 into
> tpower
> if leadZeros > 0 then delete char 1 to leadZeros of x
> put "." after char 1 of x
> put x into tmant
> else --decimal within
> put offset(".",x)-2 into tpower
> replace "." with empty in x
> put "." after char 1 of x
> put x into tmant
> end if
> end if
> return tsign & tmant &"," & tpower
> end SciForm
>
> function SciFormMult x,y --returns x*y
> put item 2 of x + item 2 of y into tpower
> put item 1 of x*item 1 of y into tMantProd
> put SciForm(tMantProd) into tProd
> add tPower to item 2 of tProd
> return tProd
> end SciFormMult
>
> function SciFormDivide x,y --returns x/y
> put item 2 of x - item 2 of y into tpower
> put item 1 of x/item 1 of y into tMantDiv
> put SciForm(tMantDiv) into tDiv
> add tPower to item 2 of tDiv
> return tDiv
> end SciFormDivide
>
> function SciFormAdd x,y
> put item 2 of x into xp
> put item 2 of y into yp
> put xp-yp into pdiff
> put item 1 of x into xmant
> put item 1 of y into ymant
> multiply ymant by 10^-pdiff
> put ymant + xmant into mantSum
> put sciForm(mantSum) into tsum
> add xp to item 2 of tsum
> return tsum
> end SciFormAdd
>
> function sciFormSubtract x,y
> multiply item 1 of y by -1
> return SciFormAdd(x,y)
> end sciFormSubtract
>
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your
> subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode
>
More information about the Use-livecode
mailing list