Is 0.000001 as small a number as can be worked with?

Michael Julian Lew michaell at unimelb.edu.au
Thu Dec 5 05:17:34 EST 2013


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




More information about the use-livecode mailing list