PureBytes Links
Trading Reference Links
|
Hi all,
it is sometimes erroneously believed that computer arithmetic is precise,
and that using a computer precludes calculation errors. As regards
floating-point numbers, nothing could be further from the truth.
Here are two short programs that I posted to the Omega list some time ago
(summary of results attached). They may serve to demonstrate some of the
pitfalls that can occur even in simple calculations.
The iteration example demonstrated below uses no advanced mathematics, only
very simple basic math (square a number, then subtract 2). This formula
generates normalized numbers that will not grow out of bounds, but will stay
roughly between -2 and 2, for easier handling. In spite of this simplicity
you will see that after only 27 iterations the single-precision calculation
will create errors of a magnitude of more than 100%, with all further
iteration results in single precision proving totally meaningless and
belonging purely to the realm of chance.
Double precision fares somewhat better; it takes 58 iterations for
double-precision results to become equally worthless.
Please note that the errors do not merely crop up in the last, most
insignificant decimal places, but sooner rather than later mercilessly
destroy even the most significant digits.
To compare single precision with double precision, C++ was used; to be able
to verify, in turn, the double precision results from C++, I had to resort
to the arbitrary-precision capabilities of Mathematica. I used an internal
precision of 50 decimal digits, which is sufficient to ensure a 19 digits
precision in the result after the one-hundredth iteration.
Here are the programs, first C++, then Mathematica:
-------------------------------------------------
#include <condefs.h>
#include <iostream.h>
int main(int argc, char **argv)
{
float a[101]; // single precision
double b[101]; // double precision
a[0]=b[0]=0.5; // initial condition
for (int i=1; i<=100; i++) // 100 iterations
{
a[i] = a[i-1]*a[i-1] - 2;
b[i] = b[i-1]*b[i-1] - 2;
cout<<"i="<<i<<" a["<<i<<"]="<<a[i]<<" b["<<i<<"]="<<b[i]<<"\n";
}
getchar();
return 0;
}
--------------------------------------------------
a[0] = 0.5`50
Table[{i, a[i]=N[a[i-1]^2-2, 50], Precision[a[i]]}, {i,1,100}]
--------------------------------------------------
Please find the results in the attached text file. Single and double
precision results are rounded to 6 significant places, the Mathematica
results are given to the precision guaranteed to be correct (>=19).
I would like to add that this example is by no means contrived in any way. I
could easily demonstrate thousands of similar cases, and there is no doubt
in my mind that every one of us who uses any single-precision software at
all will, unwittingly and without any fault of his, already have fallen prey
to this phenomenon at one time or another.
Michael Suesserott
# single double Mathematica at 50-digit precision prec. of result
----------------------------------------------------------------------------------------------
1 -1.75 -1.75 -1.7500000000000000000000000000000000000000000000000 50
2 1.0625 1.0625 1.0625000000000000000000000000000000000000000000000 49
3 -0.871094 -0.871094 -0.871093750000000000000000000000000000000000000000 49
4 -1.2412 -1.2412 -1.241195678710937500000000000000000000000000000000 49
5 -0.459433 -0.459433 -0.459433287149295210838317871093750000000000000000 48
6 -1.78892 -1.78892 -1.788921054659193252080098129885854518761334475130 49
7 1.20024 1.20024 1.20023853980296029103616942146559932822994385585 48
8 -0.559428 -0.559427 -0.55942744757165770517872120586641774767987466760 47
9 -1.68704 -1.68704 -1.68704093090346016954118610226457525896711600101 48
10 0.846105 0.846107 0.8461071025436134700976808284823970380034397252 47
11 -1.28411 -1.2841 -1.2841027710252511601194596297119578400659285765 47
12 -0.351073 -0.35108 -0.3510800734452713896386367758411034230112671787 46
13 -1.87675 -1.87674 -1.8767427820296628468434453038037188577989524178 47
14 1.52218 1.52216 1.522163469900438591414894800333710715286642548 46
15 0.317038 0.316982 0.316981629099343421669929432001286780069937610 45
16 -1.89949 -1.89952 -1.899522646813526279727394621229285368058538031 46
17 1.60805 1.60819 1.60818628575746449957845858701433495072292888 45
18 0.585826 0.586263 0.58626312969838926476668323027550982124226673 44
19 -1.65681 -1.6563 -1.65629554275624960726800210379235578984224126 44
20 0.745011 0.743315 0.7433149249542194708863988360088077971952959 44
21 -1.44496 -1.44748 -1.4474829223403030761269776745381301819987566 44
22 0.087905 0.095207 0.0952068104668238661115383583599189149853326 42
23 -1.99227 -1.99094 -1.9909356632407342775333821354445070851649882 44
24 1.96915 1.96383 1.9638248151638224859534533253066504813887021 44
25 1.87755 1.85661 1.856607904653221551367598957266904811841229 43
26 1.52521 1.44699 1.446992911620825807091150862298880145718986 42
27 0.326266 0.093788 0.09378848628091500503892233990641233248724 41
28 -1.89355 -1.9912 -1.991203719841134617886520965281182647668228 43
29 1.58553 1.96489 1.96489225390917172033807637748582517248492 42
30 0.513916 1.8608 1.86080156947226494970453084715090036079062 41
31 -1.73589 1.46258 1.4625824809504444800108283562940121929374 41
32 1.01331 0.139148 0.1391475135831572902564402379886938275275 39
33 -0.973196 -1.98064 -1.9806379694636250574059219921222561750316 41
34 -1.05289 1.92293 1.9229267660809917453708956799535634030597 40
35 -0.891423 1.69765 1.697647347710701146004063463571177411445 40
36 -1.20537 0.882007 0.88200651718917823955241209923397008885 39
37 -0.547096 -1.22206 -1.22206450363581583064458232449182553013 39
38 -1.70069 -0.506559 -0.50655834895334707644333089345636482020 38
39 0.892332 -1.7434 -1.74339863910565905486360252582371345504 39
40 -1.20374 1.03944 1.0394388148354640259056257841907185515 38
41 -0.551001 -0.919571 -0.9195669502134459308479819793235229667 37
42 -1.6964 -1.15439 -1.1543966240751418527148614298414483394 37
43 0.877765 -0.667388 -0.667368434323915621804071163497016435 37
44 -1.22953 -1.55459 -1.554619372868045521352040215536158293 37
45 -0.488261 0.416762 0.416841394496635151296945728730469405 36
46 -1.7616 -1.82631 -1.826243251834100586201313995483550391 37
47 1.10324 1.33541 1.33516441486959013410631061106873241 36
48 -0.782867 -0.21669 -0.21733598526594499959534575720583669 35
49 -1.38712 -1.95305 -1.95276506950848093804351511407442882 36
50 -0.0759 1.81439 1.81329141669246238938601189782980277 35
51 -1.99424 1.292 1.2880257618505572696325139303314855 35
52 1.97699 -0.330742 -0.3409896368092915292915504401586577 34
53 1.90849 -1.89061 -1.8837260675886674553630289756862626 35
54 1.64233 1.57441 1.548423897713064950270322632156628 34
55 0.697253 0.478751 0.397616567008920227731829970366544 33
56 -1.51384 -1.7708 -1.841901065640040850344743570647498 34
57 0.291706 1.13572 1.39259953560591807319662988996508 33
58 -1.91491 -0.710134 -0.06066653343018132066941779190874 31
59 1.66687 -1.49571 -1.996319571721564692242194398219879 33
60 0.778462 0.237146 1.98529183243857147525202470339640 33
61 -1.394 -1.94376 1.9413836599473009593244145091349 32
62 -0.056772 1.77821 1.7689705151103774870722631230910 32
63 -1.99678 1.16203 1.129256683329874265313437467792 31
64 1.98712 -0.649693 -0.724779343154812073581354268671 30
65 1.94864 -1.5779 -1.474694903736079165018510014079 31
66 1.79719 0.489766 0.17472505910516379525639777401 29
67 1.2299 -1.76013 -1.969471153720697018327264533785 31
68 -0.487351 1.09806 1.87881662533793338481672381761 30
69 -1.76249 -0.794275 1.52995191164622034818656554568 29
70 1.10637 -1.36913 0.3407528519499240346878434207 28
71 -0.775949 -0.125489 -1.8838874938879931519910332470 29
72 -1.3979 -1.98425 1.5490320896275834355996430025 28
73 -0.045865 1.93726 0.399500414695997681931284904 27
74 -1.9979 1.75297 -1.840399418657725879366409949 28
75 1.99159 1.0729 1.387070020195695375611561491 27
76 1.96643 -0.848879 -0.07603675907431322283483110 26
77 1.86685 -1.2794 -1.994218411269474845764066846 28
78 1.48514 -0.363124 1.976907071846148318520791627 27
79 0.205629 -1.86814 1.90816157071531222971299343 27
80 -1.95772 1.48995 1.6410805799547275150903640 26
81 1.83265 0.219951 0.6931454699045448084149562 25
82 1.35862 -1.95162 -1.5195493575508077672611988 25
83 -0.154147 1.80883 0.309030250033072626448110 24
84 -1.97624 1.27185 -1.904500304564496615960074 25
85 1.90552 -0.382388 1.627121410086260369724522 25
86 1.631 -1.85378 0.64752408316110028883401 24
87 0.66017 1.4365 -1.58071256172637647737749 24
88 -1.56418 0.063529 0.49865220279956356513869 23
89 0.446646 -1.99596 -1.75134598064314293056994 24
90 -1.80051 1.98387 1.0672127439148919724518 23
91 1.24183 1.93575 -0.8610569592256472072250 22
92 -0.45787 1.74713 -1.2585809129690821228291 22
93 -1.79036 1.05247 -0.415974085509911731155 21
94 1.20537 -0.892301 -1.826965560184192643144 22
95 -0.547081 -1.2038 1.337803158099140830894 21
96 -1.7007 -0.550866 -0.21028271017996520268 20
97 0.892389 -1.69655 -1.955781181799368758919 22
98 -1.20364 0.878269 1.82508003108053551238 21
99 -0.551245 -1.22864 1.33091711984892847188 20
100 -1.69613 -0.490437 -0.2286596200930329662 19
|