It seems to be the way a double is returned.
Code: Select all
Function plus(Byval num1 As String,Byval num2 As String) As String
Static As Const Ubyte AddQMod(0 To 19)={48,49,50,51,52,53,54,55,56,57,48,49,50,51,52,53,54,55,56,57}
Static As Const Ubyte AddBool(0 To 19)={0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1}
Var n_=0
Dim As Ubyte addup=Any,addcarry
#macro finish()
Return Ltrim(answer,"0")
#endmacro
If Len(num2)>Len(num1) Then Swap num2,num1
Var diff=Len(num1)-Len(num2)
Var answer="0"+num1
For n_=Len(num1)-1 To diff Step -1
addup=num2[n_-diff]+num1[n_]-96
answer[n_+1]=ADDQmod(addup+addcarry)
addcarry=ADDbool(addup+addcarry)
Next n_
If addcarry=0 Then
finish()
End If
If n_=-1 Then
answer[0]=addcarry+48
finish()
End If
For n_=n_ To 0 Step -1
addup=num1[n_]-48
answer[n_+1]=ADDQmod(addup+addcarry)
addcarry=ADDbool(addup+addcarry)
If addcarry=0 Then Exit For
Next n_
answer[0]=addcarry+48
finish()
End Function
Function minus(byval num1 As String,byval num2 As String) As String
Static As Const Ubyte subqmod(19)={48,49,50,51,52,53,54,55,56,57,48,49,50,51,52,53,54,55,56,57}
Static As Const Ubyte subbool(19)={1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0}
Dim As Integer bigger
Dim sign As String * 1
Var lenf=Len(NUM1)
Var lens=Len(NUM2)
#macro finishup()
answer=Ltrim(answer,"0")
If answer="" Then Return "0"
Return sign+answer
#endmacro
#macro compare()
If Lens>lenf Then bigger= -1:Goto fin
If Lens<lenf Then bigger =0:Goto fin
If NUM2>NUM1 Then
bigger=-1
Else
bigger= 0
End If
fin:
#endmacro
compare()
If bigger Then
sign="-"
Swap NUM2,NUM1
Swap lens,lenf
End If
Var diff=lenf-lens
Dim As String answer=NUM1
Dim As Integer n
Dim As Ubyte takeaway,subtractcarry
subtractcarry=0
For n=lenf-1 To diff Step -1
takeaway= num1[n]-num2[n-diff]+10-subtractcarry
answer[n]=Subqmod(takeaway)
subtractcarry=Subbool(takeaway)
Next n
If subtractcarry=0 Then:finishup():End If
If n=-1 Then:finishup():End If
For n=n To 0 Step -1
takeaway= num1[n]-38-subtractcarry
answer[n]=Subqmod(takeaway)
subtractcarry=Subbool(takeaway)
If subtractcarry=0 Then Exit For
Next n
finishup()
End Function
Function rndX (s1 As String) As String
#macro GetNumber
#define range(f,l) Int(Rnd*((l+1)-(f))+(f))
s[0]=range(48,s1[0])
For n As Long = 1 To L-1
s[n]=range(48,57)
Next
#endmacro
#macro compare(n1,n2,ans)
Scope
Var lenn1=Len(n1),lenn2=Len(n2)
If lenn1 > lenn2 Then ans=-1:Goto lbl
If lenn1 < lenn2 Then ans=0:Goto lbl
If n1 > n2 Then ans = -1 Else ans= 0
lbl:
End Scope
#endmacro
Dim As Long L=Len(s1),ans=1
Dim As String s=String(L,0)
While ans
GetNumber
compare(s,s1,ans)
Wend
Return Ltrim(s,"0")
End Function
Function base2(DecimalNumber As String) As String
Dim As String starter=DecimalNumber,ans,m,b
Dim As Ubyte main,carry,temp',c
Dim As Integer c
#macro reverse(s)
Scope
var lens=Len(s)
For n As Integer=0 To Int((lens-1)/2):Swap s[n],s[lens-1-n]:Next
End Scope
#endmacro
#macro div2(s,m,c)
carry=0:ans=s
For z As Integer=0 To Len(s)-1
temp=(s[z]-48+carry)
main=temp Shr 1
carry=(temp And 1) Shl 3 +(temp And 1) Shl 1
ans[z]=main+48
Next z
c= carry\10
m= Ltrim(ans,"0")
#endmacro
Do
c=0
div2(starter,m,c)
b=b+Str(c)
starter=m
Loop Until m="1"
reverse(b)
b=Str(m)+b
Return b
End Function
dim as ulongint a = culngint(2^64) - 1
? bin(a, 64) 'ok
randomize 2
print
print "Pure big ulongint and fb bin 64 digits"
dim as long iter
for iter = 1 to 10
dim as string s=rndX("18446744073709551616")
dim as ulongint a = valulng(s)'=(rnd()*2^64)
? bin(a, 64),a
next iter
print
print "Alternative bin for ulongint derived from a double"
randomize 2
for iter = 1 to 10
dim as ulongint a = rnd()*2^64
? base2(str(a)),a
next iter
print
print "FB bin for ulongint derived from a double"
randomize 2
for iter = 1 to 10
dim as ulongint a = rnd()*2^64
? bin(a),a
next iter
print
print "Alternative bin for ulongint derived from a double via str()"
randomize 2
for iter = 1 to 10
dim as string u=str(rnd()*2^64)
dim as ulongint a = val(u)
? base2(str(a)),a
next iter
print
print "FB bin for ulongint derived from a double via str()"
randomize 2
for iter = 1 to 10
dim as string u=str(rnd()*2^64)
dim as ulongint a = val(u)
? bin(a),a
next iter
print
sleep