# How precise do I want? (& what can a computer provide?)

Liberty BASIC inherits from its Smalltalk parent an ability to calculate particularly big integers. Just make sure that at no stage will a value be non-integer!

There are few occasions where such big integers are needed. Scientific calculations in the real world are normally adeguate with say ten digits and a power of ten. But huge integers have significant value in encryption.

My first example shows 2^n up to the 200th value, then divides back down. I haven't bothered to right-align.

twos =1

for i =1 to 200
print twos
twos =twos *2
next i

for i =1 to 200
twos =twos /2
print twos
next i

end
...which results in..

1
2
4
8
16
32

..... etc

6277101735386680763835789423207666416102355444464034512896
12554203470773361527671578846415332832204710888928069025792
25108406941546723055343157692830665664409421777856138051584
50216813883093446110686315385661331328818843555712276103168
100433627766186892221372630771322662657637687111424552206336
200867255532373784442745261542645325315275374222849104412672
401734511064747568885490523085290650630550748445698208825344
803469022129495137770981046170581301261101496891396417650688
803469022129495137770981046170581301261101496891396417650688
401734511064747568885490523085290650630550748445698208825344
200867255532373784442745261542645325315275374222849104412672
100433627766186892221372630771322662657637687111424552206336

..... etc

32768
16384
8192
4096
2048
1024
512
256
128
64
32
16
8
4
2
1

In the second example I multiply a 12 digit prime number by itself 10 times, then divide back to show there was no error.

Code:

bigPrime1 = 32416190071'    373587509'  32452591 '15280697
bigPrime2 = 32416187893'    573259073'  86027819 '15279769
bigPrime3 = 32416189063

n =1
for i =0 to 10
n =n *bigPrime3
print n
next i

for i =1 to 10
n =n /bigPrime3
print n
next i

end
Produces
32416189063
1050809313368160817969
34063233371303514399871831673047
1104200213061265601542588278481603153284961
35793962869998867741662966081627342384222265290581543
1160303867707885387309678550527388221437182139873633931106264209
37612629546148953170965520823651614945707005824110628439592577342574146167
1219258110524544349549551685273754232125314780998012255325577661828333641245268771521
39523701427359779736926626316724290100370592249220005095824954105516741564849847251874486074823
1281207777938857580874249921241685906738072364715998099468085144237728745877883123723434321747423132260849
41531873558652127795850498275283350069683939394809284693106127770191840044087341248835867497427640788427335816894487
1281207777938857580874249921241685906738072364715998099468085144237728745877883123723434321747423132260849
39523701427359779736926626316724290100370592249220005095824954105516741564849847251874486074823
1219258110524544349549551685273754232125314780998012255325577661828333641245268771521
37612629546148953170965520823651614945707005824110628439592577342574146167
1160303867707885387309678550527388221437182139873633931106264209
35793962869998867741662966081627342384222265290581543
1104200213061265601542588278481603153284961
34063233371303514399871831673047
1050809313368160817969
32416189063

You can also do Fibonacci numbers very easily- they increase even quicker...

oneBack     =1
print oneBack

fib         =2

for i =1 to 300
print fib
temp        =fib
fib         =fib +oneBack

oneBack     =temp
next i

end

..resulting in...

1
2
3
5
8
13
21
34
55
89
144

.... etc ...

52461916524905785334311649958648296484733611329035169538240802
84885164052257330097714121751630835360966663883732297726369399
137347080577163115432025771710279131845700275212767467264610201
222232244629420445529739893461909967206666939096499764990979600
359579325206583560961765665172189099052367214309267232255589801
581811569836004006491505558634099066259034153405766997246569401

Where real problems come in is with fractions leading to multi-digit decimals. And using LB's 'using(' command is not a huge help and may muddy the waters.

n =1

for i =1 to 40
print n; tab( 24); using( "#.############################", n)
n =n /2
next i

for i =1 to 41
print n; tab( 24); using( "#.############################", n)
n =n *2
next i

end

.. results in ...

1                      0.9999999999999999583119736832
0.5                    0.4999999999999999791559868416
0.25                   0.2499999999999999895779934208
0.125                  0.1249999999999999947889967104
0.0625                 0.0624999999999999973944983552
0.03125                0.0312499999999999986972491776
0.015625               0.0156249999999999993486245888
0.0078125              0.0078124999999999996743122944
0.390625e-2            0.0039062499999999998371561472
0.1953125e-2           0.0019531249999999999185780736
0.9765625e-3           0.0009765624999999999592890368
0.48828125e-3          0.0004882812499999999796445184
0.24414063e-3          0.0002441406249999999898222592
0.12207031e-3          0.0001220703124999999949111296
0.61035156e-4          0.0000610351562499999974555648
0.30517578e-4          0.0000305175781249999987277824
0.15258789e-4          0.0000152587890624999993638912
0.76293945e-5          0.0000076293945312499996819456
0.38146973e-5          0.0000038146972656249998409728
0.19073486e-5          0.0000019073486328124999204864
0.95367432e-6          0.0000009536743164062499602432
0.47683716e-6          0.0000004768371582031249801216
0.23841858e-6          0.0000002384185791015624900608
0.11920929e-6          0.0000001192092895507812450304
0.59604645e-7          0.0000000596046447753906225152
0.29802322e-7          0.0000000298023223876953112576
0.14901161e-7          0.0000000149011611938476556288
0.74505806e-8          0.0000000074505805969238278144
0.37252903e-8          0.0000000037252902984619139072
0.18626451e-8          0.0000000018626451492309569536
0.93132257e-9          0.0000000009313225746154784768
0.46566129e-9          0.0000000004656612873077392384
0.23283064e-9          0.0000000002328306436538696192
0.11641532e-9          0.0000000001164153218269348096
0.58207661e-10         0.0000000000582076609134674048
0.2910383e-10          0.0000000000291038304567337024
0.14551915e-10         0.0000000000145519152283668512
0.72759576e-11         0.0000000000072759576141834256
0.36379788e-11         0.0000000000036379788070917128
0.18189894e-11         0.0000000000018189894035458564
0.9094947e-12          0.0000000000009094947017729282
0.18189894e-11         0.0000000000018189894035458564
0.36379788e-11         0.0000000000036379788070917128
0.72759576e-11         0.0000000000072759576141834256
0.14551915e-10         0.0000000000145519152283668512
0.2910383e-10          0.0000000000291038304567337024
0.58207661e-10         0.0000000000582076609134674048
0.11641532e-9          0.0000000001164153218269348096
0.23283064e-9          0.0000000002328306436538696192
0.46566129e-9          0.0000000004656612873077392384
0.93132257e-9          0.0000000009313225746154784768
0.18626451e-8          0.0000000018626451492309569536
0.37252903e-8          0.0000000037252902984619139072
0.74505806e-8          0.0000000074505805969238278144
0.14901161e-7          0.0000000149011611938476556288
0.29802322e-7          0.0000000298023223876953112576
0.59604645e-7          0.0000000596046447753906225152
0.11920929e-6          0.0000001192092895507812450304
0.23841858e-6          0.0000002384185791015624900608
0.47683716e-6          0.0000004768371582031249801216
0.95367432e-6          0.0000009536743164062499602432
0.19073486e-5          0.0000019073486328124999204864
0.38146973e-5          0.0000038146972656249998409728
0.76293945e-5          0.0000076293945312499996819456
0.15258789e-4          0.0000152587890624999993638912
0.30517578e-4          0.0000305175781249999987277824
0.61035156e-4          0.0000610351562499999974555648
0.12207031e-3          0.0001220703124999999949111296
0.24414063e-3          0.0002441406249999999898222592
0.48828125e-3          0.0004882812499999999796445184
0.9765625e-3           0.0009765624999999999592890368
0.1953125e-2           0.0019531249999999999185780736
0.390625e-2            0.0039062499999999998371561472
0.0078125              0.0078124999999999996743122944
0.015625               0.0156249999999999993486245888
0.03125                0.0312499999999999986972491776
0.0625                 0.0624999999999999973944983552
0.125                  0.1249999999999999947889967104
0.25                   0.2499999999999999895779934208
0.5                    0.4999999999999999791559868416
1                      0.9999999999999999583119736832

Basically, to progress reliably to many-digit figures which are accurate exactly requires us to write our own routines. This is most easily done by representing the numbers in a string of length more than any result or intermediate calculation may use. Now we can for example demonstrate which fractions are exact and which form an infinite repeating sequence.

current\$ ="0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
divisor\$ ="3"

L   =len( divisor\$)
d   =val( divisor\$)

'current\$ ="00000000" +current\$
print "1/3^"; i, current\$

Lc =len( current\$)
window =W +1

for i =1 to 15

carry   =0
result\$ =""

print "1/3^"; i,
for j =1 to Lc -L +1
nextDigit           =val( mid\$( current\$, j, window)) +10 *carry
timesItGoesIntoIt   =int( nextDigit /d)
carry               =nextDigit -d *timesItGoesIntoIt
result\$             =result\$ +str\$( timesItGoesIntoIt)
print str\$( timesItGoesIntoIt);
CallDLL #kernel32, "Sleep", 10 As ulong, ret As void
scan
next j

'print result\$
print
current\$    =result\$

next i

end

1/3^0         0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
1/3^1         0033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
1/3^2         0011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
1/3^3         0003703703703703703703703703703703703703703703703703703703703703703703703703703703703703703
1/3^4         0001234567901234567901234567901234567901234567901234567901234567901234567901234567901234567
1/3^5         0000411522633744855967078189300411522633744855967078189300411522633744855967078189300411522
1/3^6         0000137174211248285322359396433470507544581618655692729766803840877914951989026063100137174
1/3^7         0000045724737082761774119798811156835848193872885230909922267946959304983996342021033379058
1/3^8         0000015241579027587258039932937052278616064624295076969974089315653101661332114007011126352
1/3^9         0000005080526342529086013310979017426205354874765025656658029771884367220444038002337042117
1/3^10        0000001693508780843028671103659672475401784958255008552219343257294789073481346000779014039
1/3^11        0000000564502926947676223701219890825133928319418336184073114419098263024493782000259671346
1/3^12        0000000188167642315892074567073296941711309439806112061357704806366087674831260666753223782
1/3^13        0000000062722547438630691522357765647237103146602037353785901602122029224943753555584407927
1/3^14        0000000020907515812876897174119255215745701048867345784595300534040676408314584518528135975
1/3^15        0000000006969171937625632391373085071915233682955781928198433511346892136104861506176045325

Here are the first 100 decimal expansions of 1/n.

for i =1 to 100
current\$ ="0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
divisor\$ =str\$( i)

L   =len( divisor\$)
d   =val( divisor\$)

Lc =len( current\$)
window =W +1

carry   =0
result\$ =""

print using( "###", i),

for j =1 to Lc -L +1
nextDigit           =val( mid\$( current\$, j, window)) +10 *carry
timesItGoesIntoIt   =int( nextDigit /d)
carry               =nextDigit -d *timesItGoesIntoIt
result\$             =result\$ +str\$( timesItGoesIntoIt)
print str\$( timesItGoesIntoIt);
if j =2 then print ".";
'CallDLL #kernel32, "Sleep", 10 As ulong, ret As void
scan
next j

'print result\$
print
current\$    =result\$

next i

end

1           01.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2           00.50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
3           00.33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
4           00.25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
5           00.20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
6           00.16666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
7           00.14285714285714285714285714285714285714285714285714285714285714285714285714285714285714285
8           00.12500000000000000000000000000000000000000000000000000000000000000000000000000000000000000
9           00.11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
10           00.1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
11           00.0909090909090909090909090909090909090909090909090909090909090909090909090909090909090909
12           00.0833333333333333333333333333333333333333333333333333333333333333333333333333333333333333
13           00.0769230769230769230769230769230769230769230769230769230769230769230769230769230769230769
14           00.0714285714285714285714285714285714285714285714285714285714285714285714285714285714285714
15           00.0666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
16           00.0625000000000000000000000000000000000000000000000000000000000000000000000000000000000000
17           00.0588235294117647058823529411764705882352941176470588235294117647058823529411764705882352
18           00.0555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
19           00.0526315789473684210526315789473684210526315789473684210526315789473684210526315789473684
20           00.0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000
21           00.0476190476190476190476190476190476190476190476190476190476190476190476190476190476190476
22           00.0454545454545454545454545454545454545454545454545454545454545454545454545454545454545454
23           00.0434782608695652173913043478260869565217391304347826086956521739130434782608695652173913
24           00.0416666666666666666666666666666666666666666666666666666666666666666666666666666666666666
25           00.0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000
26           00.0384615384615384615384615384615384615384615384615384615384615384615384615384615384615384
27           00.0370370370370370370370370370370370370370370370370370370370370370370370370370370370370370
28           00.0357142857142857142857142857142857142857142857142857142857142857142857142857142857142857
29           00.0344827586206896551724137931034482758620689655172413793103448275862068965517241379310344
30           00.0333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
31           00.0322580645161290322580645161290322580645161290322580645161290322580645161290322580645161
32           00.0312500000000000000000000000000000000000000000000000000000000000000000000000000000000000
33           00.0303030303030303030303030303030303030303030303030303030303030303030303030303030303030303
34           00.0294117647058823529411764705882352941176470588235294117647058823529411764705882352941176
35           00.0285714285714285714285714285714285714285714285714285714285714285714285714285714285714285
36           00.0277777777777777777777777777777777777777777777777777777777777777777777777777777777777777
37           00.0270270270270270270270270270270270270270270270270270270270270270270270270270270270270270
38           00.0263157894736842105263157894736842105263157894736842105263157894736842105263157894736842
39           00.0256410256410256410256410256410256410256410256410256410256410256410256410256410256410256
40           00.0250000000000000000000000000000000000000000000000000000000000000000000000000000000000000
41           00.0243902439024390243902439024390243902439024390243902439024390243902439024390243902439024
42           00.0238095238095238095238095238095238095238095238095238095238095238095238095238095238095238
43           00.0232558139534883720930232558139534883720930232558139534883720930232558139534883720930232
44           00.0227272727272727272727272727272727272727272727272727272727272727272727272727272727272727
45           00.0222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
46           00.0217391304347826086956521739130434782608695652173913043478260869565217391304347826086956
47           00.0212765957446808510638297872340425531914893617021276595744680851063829787234042553191489
48           00.0208333333333333333333333333333333333333333333333333333333333333333333333333333333333333
49           00.0204081632653061224489795918367346938775510204081632653061224489795918367346938775510204
50           00.0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000
51           00.0196078431372549019607843137254901960784313725490196078431372549019607843137254901960784
52           00.0192307692307692307692307692307692307692307692307692307692307692307692307692307692307692
53           00.0188679245283018867924528301886792452830188679245283018867924528301886792452830188679245
54           00.0185185185185185185185185185185185185185185185185185185185185185185185185185185185185185
55           00.0181818181818181818181818181818181818181818181818181818181818181818181818181818181818181
56           00.0178571428571428571428571428571428571428571428571428571428571428571428571428571428571428
57           00.0175438596491228070175438596491228070175438596491228070175438596491228070175438596491228
58           00.0172413793103448275862068965517241379310344827586206896551724137931034482758620689655172
59           00.0169491525423728813559322033898305084745762711864406779661016949152542372881355932203389
60           00.0166666666666666666666666666666666666666666666666666666666666666666666666666666666666666
61           00.0163934426229508196721311475409836065573770491803278688524590163934426229508196721311475
62           00.0161290322580645161290322580645161290322580645161290322580645161290322580645161290322580
63           00.0158730158730158730158730158730158730158730158730158730158730158730158730158730158730158
64           00.0156250000000000000000000000000000000000000000000000000000000000000000000000000000000000
65           00.0153846153846153846153846153846153846153846153846153846153846153846153846153846153846153
66           00.0151515151515151515151515151515151515151515151515151515151515151515151515151515151515151
67           00.0149253731343283582089552238805970149253731343283582089552238805970149253731343283582089
68           00.0147058823529411764705882352941176470588235294117647058823529411764705882352941176470588
69           00.0144927536231884057971014492753623188405797101449275362318840579710144927536231884057971
70           00.0142857142857142857142857142857142857142857142857142857142857142857142857142857142857142
71           00.0140845070422535211267605633802816901408450704225352112676056338028169014084507042253521
72           00.0138888888888888888888888888888888888888888888888888888888888888888888888888888888888888
73           00.0136986301369863013698630136986301369863013698630136986301369863013698630136986301369863
74           00.0135135135135135135135135135135135135135135135135135135135135135135135135135135135135135
75           00.0133333333333333333333333333333333333333333333333333333333333333333333333333333333333333
76           00.0131578947368421052631578947368421052631578947368421052631578947368421052631578947368421
77           00.0129870129870129870129870129870129870129870129870129870129870129870129870129870129870129
78           00.0128205128205128205128205128205128205128205128205128205128205128205128205128205128205128
79           00.0126582278481012658227848101265822784810126582278481012658227848101265822784810126582278
80           00.0125000000000000000000000000000000000000000000000000000000000000000000000000000000000000
81           00.0123456790123456790123456790123456790123456790123456790123456790123456790123456790123456
82           00.0121951219512195121951219512195121951219512195121951219512195121951219512195121951219512
83           00.0120481927710843373493975903614457831325301204819277108433734939759036144578313253012048
84           00.0119047619047619047619047619047619047619047619047619047619047619047619047619047619047619
85           00.0117647058823529411764705882352941176470588235294117647058823529411764705882352941176470
86           00.0116279069767441860465116279069767441860465116279069767441860465116279069767441860465116
87           00.0114942528735632183908045977011494252873563218390804597701149425287356321839080459770114
88           00.0113636363636363636363636363636363636363636363636363636363636363636363636363636363636363
89           00.0112359550561797752808988764044943820224719101123595505617977528089887640449438202247191
90           00.0111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
91           00.0109890109890109890109890109890109890109890109890109890109890109890109890109890109890109
92           00.0108695652173913043478260869565217391304347826086956521739130434782608695652173913043478
93           00.0107526881720430107526881720430107526881720430107526881720430107526881720430107526881720
94           00.0106382978723404255319148936170212765957446808510638297872340425531914893617021276595744
95           00.0105263157894736842105263157894736842105263157894736842105263157894736842105263157894736
96           00.0104166666666666666666666666666666666666666666666666666666666666666666666666666666666666
97           00.0103092783505154639175257731958762886597938144329896907216494845360824742268041237113402
98           00.0102040816326530612244897959183673469387755102040816326530612244897959183673469387755102
99           00.0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101
100           00.0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000

It's an easy exercise to check ( say) that the expansion of 1/7 and of 6/7 correctly add to 1.000000000000..

And we can calculate pi or e to any desired precision. But it may become very slow!

See on my other pages or forum replies...