И про NUMERIC DIGITS
Автор: Виктор Смирнов
Дата: 23.05.2015
Источник: vasm.livejournal.com
---
И ведь никогда особо и не задумывался над смыслом этой фразы, а тут как по темечку тюкнуло. И вся моя физическая сущность :) возопила: "В REXX, в старом добром REXX можно выполнять вычисления с ЛЮБОЙ заданной точностью!!!" Только мозгов добавляй в случае чего... Да физики на него молиться должны!!!
А рекуррентное соотношение Мюллера - лучший способ проверки возможностей REXX!
Тест № 1.
/* muller.cmd - Jean-Michel Muller's Recurrence */ /* see https://habrahabr.ru/post/258483/ */ /* Usage: muller dimension [precision] */ parse version _v say _v parse arg _n _p . if (\ownCheck(_n, _p)) then exit; if (_p \== '') then numeric digits _p say 'Dimension = '||_n say 'Precision = '||Digits() say '' signal on halt signal on syntax _t = Time('E'); do i=0 to _n select when (i == 0) then _xn = 4.0; when (i == 1) then do _xp = _xn; _xn = 4.25; end; otherwise do _xpp = _xp; _xp = _xn; _xn = 108.0-(815.0-1500.0/_xpp)/_xp; end; end; say Right(i, 5, ' ')||' '||ownTime(Time('R'))||' '||ownNum(_xn) end; exit; halt: say 'Halted...' exit; syntax: say 'Interrupted...' exit; ownUsage: procedure say '' say 'Usage: muller dimension [precision]' return 0; ownCheck: procedure _n = Arg(1); _p = Arg(2); if \DataType(_n, 'W') then do say 'Error - dimension is non-whole number' return ownUsage(); end; if (_n < 0) | (_n > 99999) then do say 'Error - dimension is out range (should be from 0 to 99999)' return ownUsage(); end; if (_p == '') then _p = Digits(); if \DataType(_p, 'W') then do say 'Error - precision is non-whole number' return ownUsage(); end; _f = Fuzz(); if (_p <= _f) then do say 'Error - precision is out range (should be > '||_f||')' return ownUsage(); end; return 1; ownTime: procedure _t = Arg(1); if (_t == 0) then _t = '0.000000'; return Right(Left(_t, Length(_t)-4), 9, ' '); ownNum: procedure _n = Arg(1); if (Length(_n) > 43) then _n = Left(_n, 30)||'...'||Right(_n, 10); return _n; |
Тесты выполнялись под OS/2 Warp v4.50, установленной на виртуальной машине VirtualBox под OpenSUSE Linux v13.1.
20 итераций с точностью по умолчанию (9 знаков)
C:\>muller.cmd 20 OBJREXX 6.00 18 May 1999 Dimension = 20 Precision = 9 0 0.00 4.0 1 0.00 4.25 2 0.00 4.470588 3 0.00 4.644731 4 0.00 4.770412 5 0.01 4.853056 6 0.00 4.856383 7 0.01 3.824443 8 0.00 -24.340356 9 0.01 125.369755 10 0.00 101.007675 11 0.00 100.049759 12 0.00 100.002483 13 0.00 100.000124 14 0.00 100.000006 15 0.00 100.000000 16 0.00 100.000000 17 0.00 100.0 18 0.00 100.0 19 0.00 100.0 20 0.00 100.0 |
100 итераций с точность 65536 знаков
C:\>muller.cmd 100 65536 OBJREXX 6.00 18 May 1999 Dimension = 100 Precision = 65536 0 0.00 4.0 1 0.00 4.25 2 0.01 4.4705882352941176470588235294...5882352941 3 34.59 4.6447368421052631578947368421...7368421048 4 73.38 4.7705382436260623229461756373...4617563639 5 76.95 4.8557007125890736342042755344...7007123788 6 77.44 4.9108474990827932004402592637...8474947548 7 76.95 4.9455374041239167247733838031...4639023381 8 75.54 4.9669625817627005987119384872...6732428062 9 75.01 4.9800457013556311612686079942...4289882547 10 74.16 4.9879794484783922601401328939...3263612238 11 73.64 4.9927702880620680974895925483...7698473716 12 72.90 4.9956558915066340266240282615...3394321302 13 72.56 4.9973912683813441128938690216...9930742186 14 72.40 4.9984339439448169190138971781...2401474625 15 72.28 4.9990600719708938678168396062...9486544354 16 72.24 4.9994359371468391479978508864...7267981961 17 72.38 4.9996615241037675377868879857...2279237545 18 72.26 4.9997969007134179126629930746...4941997026 19 72.16 4.9998781354779312492317320300...8880024436 20 72.34 4.9999268795045999044664529810...4347400137 21 72.27 4.9999561270611577381190152822...1374158392 22 72.14 4.9999736760057124445790151493...5953103632 23 72.19 4.9999842055202727079241797881...1228303459 24 72.27 4.9999905232822276594072074700...5063049141 25 72.37 4.9999943139585595936498116895...1576223065 26 72.26 4.9999965883712560237063808793...3595927231 27 72.16 4.9999979530213569079884128681...4678182904 28 72.23 4.9999987718123113299993645145...1528744657 29 72.30 4.9999992630872057845553229449...8351857232 30 72.20 4.9999995578522583058676361926...6551923789 31 72.41 4.9999997347113315241634489886...4868002178 32 72.15 4.9999998408267904691283066991...4486641201 33 72.28 4.9999999044960712411436113485...8704788268 34 72.19 4.9999999426976416501660968977...5031419126 35 72.32 4.9999999656185845960724209285...5966073504 36 72.38 4.9999999793711506157936445604...1232930199 37 72.33 4.9999999876226903184102552956...9329327332 38 72.28 4.9999999925736141726624177373...9624765115 39 72.23 4.9999999955441684969793058578...7147474753 40 72.20 4.9999999973265010958050513865...0702375476 41 72.18 4.9999999983959006566253192645...1865476973 42 72.26 4.9999999990375403936664153942...1250623819 43 72.20 4.9999999994225242360886898172...1356679051 44 72.22 4.9999999996535145416131964994...8841051144 45 72.30 4.9999999997921087249535116388...3972876061 46 72.20 4.9999999998752652349669207294...4691499747 47 72.07 4.9999999999251591409782853862...7817492083 48 72.13 4.9999999999550954845862990932...5575579629 49 72.26 4.9999999999730572907515374861...0008980724 50 72.27 4.9999999999838343744508353825...4991641484 51 72.15 4.9999999999903006246704698702...0564482585 52 72.27 4.9999999999941803748022706327...2294009992 53 72.18 4.9999999999965082248813583155...6663132023 54 72.21 4.9999999999979049349288135262...7536204001 55 72.37 4.9999999999987429609572875890...9482591658 56 72.21 4.9999999999992457765743723637...0064627367 57 72.15 4.9999999999995474659446233500...8361959129 58 72.34 4.9999999999997284795667739854...4962400471 59 72.33 4.9999999999998370877400643824...0699283659 60 72.34 4.9999999999999022526440386262...8599098056 61 72.26 4.9999999999999413515864231746...9204422343 62 72.37 4.9999999999999648109518539043...2902916176 63 72.47 4.9999999999999788865711123424...8647087333 64 72.38 4.9999999999999873319426674054...0072394395 65 72.27 4.9999999999999923991656004432...8555107408 66 72.29 4.9999999999999954394993602659...0320107125 67 72.29 4.9999999999999972636996161595...6067790579 68 72.25 4.9999999999999983582197696957...9437269546 69 72.26 4.9999999999999990149318618174...0037104102 70 72.27 4.9999999999999994089591170904...1339667416 71 72.23 4.9999999999999996453754702542...6140165342 72 72.31 4.9999999999999997872252821525...2419642925 73 72.37 4.9999999999999998723351692915...4170596592 74 72.42 4.9999999999999999234011015749...6745151377 75 72.41 4.9999999999999999540406609449...3744711367 76 72.27 4.9999999999999999724243965669...4312954169 77 72.14 4.9999999999999999834546379401...4789610486 78 72.25 4.9999999999999999900727827641...0974086739 79 72.17 4.9999999999999999940436696584...4138295731 80 72.22 4.9999999999999999964262017950...8260590372 81 72.43 4.9999999999999999978557210770...0637363413 82 72.23 4.9999999999999999987134326462...9550980251 83 72.39 4.9999999999999999992280595877...4570752688 84 72.43 4.9999999999999999995368357526...1976807769 85 72.02 4.9999999999999999997221014515...9172410019 86 72.20 4.9999999999999999998332608709...3434742889 87 72.30 4.9999999999999999998999565225...4058714846 88 72.21 4.9999999999999999999399739135...4273356348 89 72.08 4.9999999999999999999639843481...6628737559 90 72.14 4.9999999999999999999783906088...3998065416 91 72.21 4.9999999999999999999870343653...6219062318 92 72.13 4.9999999999999999999922206191...3063095021 93 72.13 4.9999999999999999999953323715...1892394725 94 72.14 4.9999999999999999999971994229...9371948898 95 72.10 4.9999999999999999999983196537...4295034201 96 72.15 4.9999999999999999999989917922...7598393402 97 72.26 4.9999999999999999999993950753...2078349622 98 72.24 4.9999999999999999999996370452...4175332678 99 72.18 4.9999999999999999999997822271...5030611944 100 72.18 4.9999999999999999999998693362...9257595911 |
Результаты говорят сами за себя. Можно поиграться с точностью расчётов, чтобы увидеть насколько быстро накапливающиеся ошибки округления приводят к неправильному результату (ряд должен сходится к теоретически обоснованному значению 5).
Также тест прекрасно отрабатывает под Open Object REXX (проверялось в v4.2, как для Windows, так и для Linux).