(& what can a computer provide?) This article is about writing and manipulating numbers that need ( many) more figures than normally provided.
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...