LB Booster
« big float »

Welcome Guest. Please Login or Register.
Apr 1st, 2018, 04:47am



ATTENTION MEMBERS: Conforums will be closing it doors and discontinuing its service on April 15, 2018.
We apologize Conforums does not have any export functions to migrate data.
Ad-Free has been deactivated. Outstanding Ad-Free credits will be reimbursed to respective payment methods.

Thank you Conforums members.
Speed up Liberty BASIC programs by up to ten times!
Compile Liberty BASIC programs to compact, standalone executables!
Overcome many of Liberty BASIC's bugs and limitations!
LB Booster Resources
LB Booster documentation
LB Booster Home Page
LB Booster technical Wiki
Just BASIC forum
BBC BASIC Home Page
Liberty BASIC forum (the original)

« Previous Topic | Next Topic »
Pages: 1  Notify Send Topic Print
 thread  Author  Topic: big float  (Read 436 times)
bluatigro
Full Member
ImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 111
xx big float
« Thread started on: Dec 3rd, 2015, 11:00am »

for calculating whit large floats
i got + - and * ready
need some help whit /
Code:
a$ = "123.45"
b$ = "6.789"
print "a = " ; a$
print "b = " ; b$
print "test a + b = " ; bigAdd$( a$ , b$ )
print "control    = " ; val( a$ ) + val( b$ )
print "test a * b = " ; bigMulty$( a$ , b$ )
print "control    = " ; val( a$ ) * val( b$ )
print "test a - b = " ; bigMinus$( a$ , b$ )
print "control    = " ; val( a$ ) - val( b$ )
print "test a / b = " ; bigDiv$( a$ , b$ )
print "control    = " ; val( a$ ) / val( b$ )
end
function komma( byref a$ )
  if instr( a$ , "." ) = 0 then a$ = a$ + "."
  ak = len( a$ ) - instr( a$ , "." )
  l$ = left$( a$ , instr( a$ , "." ) - 1 )
  r$ = right$( a$ , ak )
  a$ = l$ + r$
  komma = ak
end function
function addkomma$( uit$ , k )
  if left$( uit$ , 1 ) = "0" then
    uit$ = right$( uit$ , len( uit$ ) - 1 )
  end if
  l$ = left$( uit$ , len( uit$ ) - k )
  r$ = right$( uit$ , k )
  addkomma$ = l$ + "." + r$
end function
function bigMinus$( a$ , b$ )
  ak = komma( a$ )
  bk = komma( b$ )
  ''same number of digits after point
  if ak < bk then
    a$ = a$ + zero$( bk - ak )
  else
    b$ = b$ + zero$( ak - bk )
  end if
  ''same number of digits fore point
  if len( a$ ) < len( b$ ) then
    a$ = zero$( len( b$ ) - len( a$ ) ) + a$
  else
    b$ = zero$( len( a$ ) - len( b$ ) ) + b$
  end if
  uit$ = minu$( a$ , b$ )
  k = maxi( ak , bk )
  bigMinus$ = addkomma$( uit$ , k )
end function
function minu$( a$ , b$ )
  a$ = "0" + a$
  b$ = "0" + b$
  c = 0
  uit$ = ""
  for i = len( a$ ) to 1 step -1
    a = val( mid$( a$ , i , 1 ) )
    b = val( mid$( b$ , i , 1 ) )
    uit$ = str$( ( a - b - c + 10 ) mod 10 ) + uit$
    if a - b - c < 0 then
      c = 1
    else
      c = 0
    end if
  next i
  minu$ = uit$
end function
function maxi( a , b )
  uit = a
  if b > a then uit = b
  maxi = uit
end function
function bigDiv$( a$ , b$ )
  ak = komma( a$ )
  bk = komma( b$ )

'' i want to do this like :
'' 13 / 123456.0000 \ 8804.3 etc...
''      114
''      ---
''       114
''       114
''       ---
''          56
''          52
''          --
''           4.0
''           3.9
''           etc...
'' or has anyone a better idea ?

  bigDiv$ = uit$
end function
function smal( a$ , b$ )
''look if a < b
''returns  0 if a = b
''         1 if a < b
''        -1 if a > b
  if len( a$ ) < len( b$ ) then smal = 1
  if len( a$ ) > len( b$ ) then smal = -1
  i = val( mid$( a$ , 1 , 1 ) )
  j = val( mid$( b$ , 1 , 1 ) )
  k = 2
  while i = j and k < len( a$ )
    i = val( mid$( a$ , k , 1 ) )
    j = val( mid$( b$ , k , 1 ) )
    k = k + 1
  wend
  if i < j then smal = 1
  if i > j then smal = -1
  smal = 0
end function
function bigAdd$( a$ , b$ )
  ak = komma( a$ )
  bk = komma( b$ )
  ''same number of digits after point
  if ak < bk then
    a$ = a$ + zero$( bk - ak )
  else
    b$ = b$ + zero$( ak - bk )
  end if
  uit$ = plu$( a$ , b$ )
  k = maxi( ak , bk )
  bigAdd$ = addkomma$( uit$ , k )
end function
function bigMulty$( a$ , b$ )
  ak = komma( a$ )
  bk = komma( b$ )
  uit$ = "0"
  for i = len( a$ ) to 1 step -1
    d = val( mid$( a$ , i , 1 ) )
    c$ = maal$( b$ , d ) + zero$( len( a$ ) - i )
    uit$ = plu$( uit$ , c$ )
  next i
  bigMulty$ = addkomma$( uit$ , ak + bk )
end function
function plu$( a$ , b$ )
  if len( a$ ) < len( b$ ) then
    a$ = zero$( len( b$ ) - len( a$ ) ) + a$
  else
    b$ = zero$( len( a$ ) - len( b$ ) ) + b$
  end if
  a$ = "0" + a$
  b$ = "0" + b$
  c = 0
  uit$ = ""
  for i = len( a$ ) to 1 step -1
    a = val( mid$( a$ , i , 1 ) )
    b = val( mid$( b$ , i , 1 ) )
    uit$ = str$( ( a + b + c ) mod 10 ) + uit$
    c = int( ( a + b + c ) / 10 )
  next i
  if left$( uit$ , 1 ) = "0" then
    uit$ = right$( uit$ , len( uit$ ) - 1 )
  end if
  plu$ = uit$
end function
function maal$( a$ , d )
  c = 0
  a$ = "0" + a$
  for i = len( a$ ) to 1 step -1
    a = val( mid$( a$ , i , 1 ) )
    uit$ = str$( ( a * d + c ) mod 10 ) + uit$
    c = int( ( a * d + c ) / 10 )
  next
  if left$( uit$ , 1 ) = "0" then
    uit$ = right$( uit$ , len( uit$ ) - 1 )
  end if
  maal$ = uit$
end function
function zero$( n )
  z$ = "00000000000000000000000000000000000000000000000000"
  z$ = z$ + z$ + z$ + z$ + z$ + z$ + z$ + z$ + z$ + z$
  zero$ = right$( z$ , n )
end function
 
User IP Logged

Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 1348
xx Re: big float
« Reply #1 on: Dec 3rd, 2015, 5:15pm »

on Dec 3rd, 2015, 11:00am, bluatigro wrote:
for calculating whit large floats
i got + - and * ready
need some help whit /

If you don't mind using a DLL there's MAPM (My Arbitrary Precision Math), it can be downloaded here (7z packed).

Richard.
User IP Logged

bluatigro
Full Member
ImageImageImage


member is offline

Avatar




PM

Gender: Male
Posts: 111
xx Re: big float
« Reply #2 on: Dec 6th, 2015, 09:00am »

@richard :
- it has to work in justbasic to
- so i cant use DLL's
- it is a progariming exercise
to show of my programming skils

[ i want programming as my job ]

update :
- first try at -+* whit negativ floats
error :
- i broke my code
Code:

a$ = "123.45"
b$ = "-6.789"
print "a = " ; a$
print "b = " ; b$
print "test a + b = " ; bigadd$( a$ , b$ )
print "control    = " ; val( a$ ) + val( b$ )
print "test a * b = " ; bigmulty$( a$ , b$ )
print "control    = " ; val( a$ ) * val( b$ )
print "test a - b = " ; bigminus$( a$ , b$ )
print "control    = " ; val( a$ ) - val( b$ )
print "test a / b = " ; bigdiv$( a$ , b$ , 30 )
print "control    = " ; val( a$ ) / val( b$ )
end
function bigadd$( a$ , b$ )
  sa$ = sign$( a$ )
  sb$ = sign$( b$ )
  call removezero a$
  call removezero b$
  if sa$ = "" and sb$ = "" then
    uit$ = posbigadd$( a$ , b$ )
  end if
  if sa$ = "-" and sb$ = "-" then
    uit$ = "-" + posbigadd$( a$ , b$ )
  end if
  if sa$ = "-" and sb$ = "" then
    if bigsmal( a$ , b$ ) = 1 then
      uit$ = posbigminus$( b$ , a$ )
    else
      uit$ = "-" + posbigminus$( a$ , b$ )
    end if
  end if
  if sa$ = "" and sb$ = "-" then
    if bigsmal( a$ , b$ ) = 1 then
      uit$ = "-" + posbigminus$( b$ , a$ )
    else
      uit$ = posbigminus$( a$ , b$ )
    end if
  end if
  bigadd$ = uit$
end function
function bigminus$( a$ , b$ )
  sa$ = sign$( a$ )
  sb$ = sign$( b$ )
  call removezero a$
  call removezero b$
  if sa$ = "-" and sb$ = "" then
    uit$ = posbigadd$( a$ , b$ )
  end if
  if sa$ = "" and sb$ = "-" then
    uit$ = "-" + posbigadd$( a$ , b$ )
  end if
  if sa$ = "-" and sb$ = "-" then
    if bigsmal( a$ , b$ ) = 1 then
      uit$ = posbigminus$( b$ , a$ )
    else
      uit$ = "-" + posbigminus$( a$ , b$ )
    end if
  end if
  if sa$ = "" and sb$ = "" then
    if bigsmal( a$ , b$ ) = 1 then
      uit$ = "-" + posbigminus$( b$ , a$ )
    else
      uit$ = posbigminus$( a$ , b$ )
    end if
  end if
  bigminus$ = uit$
end function
function bigdiv$( a$ , b$ , digits )
  bigdiv$ = "todo"
end function
function bigmulty$( a$ , b$ )
  sa$ = sign$( a$ )
  sb$ = sign$( b$ )
  if sa$ <> sb$ then uit$ = "-"
  uit$ = uit$ + posbigmulty$( a$ , b$ )
  bigmulty$ = uit$
end function
function getpoint( byref a$ )
  if instr( a$ , "." ) = 0 then a$ = a$ + "."
  ak = len( a$ ) - instr( a$ , "." )
  l$ = left$( a$ , instr( a$ , "." ) - 1 )
  r$ = right$( a$ , ak )
  a$ = l$ + r$ 
  komma = ak
end function
function addpoint$( uit$ , k )
  if left$( uit$ , 1 ) = "0" then
    uit$ = right$( uit$ , len( uit$ ) - 1 )
  end if
  l$ = left$( uit$ , len( uit$ ) - k )
  r$ = right$( uit$ , k )
  addpoint$ = uit$
end function
function bigsmal( a$ , b$ )
  ia = instr( a$ , "." )
  ib = instr( b$ , "." )
  if ia < ib then
    uit = 1
  else
    if ia > ib then
      uit = -1
    else
      if len( a$ ) < len( b$ ) then
        uit = 1
      else
        if len( a$ ) > len( b$ ) then
          uit = -1
        else
          i = ia
          while i <= len( a$ ) _
          and mid$( a$ , i , 1 ) <> mid$( b$ , i , 1 )
            i = i + 1
          wend
          if mid$( a$ , i , 1 ) < mid$( b$ , i , 1 ) then
            uit = 1
          else
            if i > len( a$ ) then
              uit = 0
            else
              uit = -1
            end if
          end if
        end if
      end if
    end if
  end if
  bigsmal = uit
end function
function sign$( byref a$ )
  uit$ = ""
  if left$( a$ , 1 ) = "-" then
    uit$ = "-"
    a$ = right$( a$ , len( a$ ) - 1 )
  end if
  sign$ = uit$
end function
function posbigminus$( a$ , b$ )
  ak = getpoint( a$ )
  bk = getpoint( b$ )
  ''same number of digits after point
  if ak < bk then
    a$ = a$ + zero$( bk - ak )
  else
    b$ = b$ + zero$( ak - bk )
  end if
  ''same number of digits fore point
  if len( a$ ) < len( b$ ) then
    a$ = zero$( len( b$ ) - len( a$ ) ) + a$
  else
    b$ = zero$( len( a$ ) - len( b$ ) ) + b$
  end if
  a$ = "0" + a$
  b$ = "0" + b$
  c = 0
  uit$ = ""
  for i = len( a$ ) to 1 step -1
    a = val( mid$( a$ , i , 1 ) )
    b = val( mid$( b$ , i , 1 ) )
    uit$ = str$( ( a - b - c + 10 ) mod 10 ) + uit$
    if a - b - c < 0 then
      c = 1
    else
      c = 0
    end if
  next i
  k = bk
  if ak > bk then k = ak
  posbigminus$ = addpoint$( uit$ , k )
end function
function posbigdiv$( a$ , b$ , digits )
  bigDiv$ = "TODO ."
end function
function oneoverN$(d,dp)
'd=denominator, N here
'dp= decimal places if 1/N doesn't divide exactly
    if d = 0 then
      oneoverN$ = "0"
      exit function  'really division by 0 is undefined
    end if
    if d = 1 then
      oneoverN$ = "1"
      exit function
    end if
    out$ = ""
    r = 10
    do
        while r - d < 0 and len( out$ ) < dp
            out$ = out$ + "0"
            if len( out$ ) >= dp then quit = 1
            r = r * 10
        wend
        if quit = 0 then
            div = int( r / d )
            out$ = out$ + str$( div )
            r = r - div * d
            if len( out$ ) >= dp then quit = 1
            r = r * 10
        end if
    loop until quit or r = 0
    oneoverN$ = "." + out$
end function
function posbigadd$( a$ , b$ )
  ak = getpoint( a$ )
  bk = getpoint( b$ )
  ''same number of digits after point
  if ak < bk then
    a$ = a$ + zero$( bk - ak )
  else
    b$ = b$ + zero$( ak - bk )
  end if
  ''same number of digits fore point
  if len( a$ ) < len( b$ ) then
    a$ = zero$( len( b$ ) - len( a$ ) ) + a$
  else
    b$ = zero$( len( a$ ) - len( b$ ) ) + b$
  end if
  a$ = "0" + a$
  b$ = "0" + b$
  c = 0
  uit$ = ""
  for i = len( a$ ) to 1 step -1
    a = val( mid$( a$ , i , 1 ) )
    b = val( mid$( b$ , i , 1 ) )
    uit$ = str$( ( a + b + c ) mod 10 ) + uit$
    c = int( ( a + b + c ) / 10 )
  next i
  k = bk
  if ak > bk then k = ak
  posbigadd$ = addpoint$( uit$ , k )
end function
function posbigmulty$( a$ , b$ )
  ak = getpoint( a$ )
  bk = getpoint( b$ )
  uit$ = "0"
  for i = len( a$ ) to 1 step -1
    d = val( mid$( a$ , i , 1 ) )
    c$ = maal$( b$ , d ) + zero$( len( a$ ) - i )
    uit$ = plu$( uit$ , c$ )
  next i
  posbigmulty$ = addpoint$( uit$ , ak + bk )
end function
function plu$( a$ , b$ )
  if len( a$ ) < len( b$ ) then
    a$ = zero$( len( b$ ) - len( a$ ) ) + a$
  else
    b$ = zero$( len( a$ ) - len( b$ ) ) + b$
  end if
  a$ = "0" + a$
  b$ = "0" + b$
  c = 0
  uit$ = ""
  for i = len( a$ ) to 1 step -1
    a = val( mid$( a$ , i , 1 ) )
    b = val( mid$( b$ , i , 1 ) )
    uit$ = str$( ( a + b + c ) mod 10 ) + uit$
    c = int( ( a + b + c ) / 10 )
  next i
  if left$( uit$ , 1 ) = "0" then
    uit$ = right$( uit$ , len( uit$ ) - 1 )
  end if
  plu$ = uit$
end function
function maal$( a$ , d )
  c = 0
  a$ = "0" + a$
  for i = len( a$ ) to 1 step -1
    a = val( mid$( a$ , i , 1 ) )
    uit$ = str$( ( a * d + c ) mod 10 ) + uit$
    c = int( ( a * d + c ) / 10 )
  next
  if left$( uit$ , 1 ) = "0" then
    uit$ = right$( uit$ , len( uit$ ) - 1 )
  end if
  maal$ = uit$
end function
function zero$( n )
  z$ = "00000000000000000000000000000000000000000000000000"
  z$ = z$ + z$ + z$ + z$ + z$ + z$ + z$ + z$ + z$ + z$
  zero$ = right$( z$ , n )
end function
sub removezero byref a$
  while left$( a$ , 1 ) = "0"
    a$ = right$( a$ , len( a$ ) - 1 )
  wend
  while right$( a$ , 1 ) = "0"
    a$ = left$( a$ , len( a$ ) - 1 )
  wend
end sub
 
« Last Edit: Dec 6th, 2015, 09:46am by bluatigro » User IP Logged

Pages: 1  Notify Send Topic Print
« Previous Topic | Next Topic »

| |

This forum powered for FREE by Conforums ©
Terms of Service | Privacy Policy | Conforums Support | Parental Controls