Statistics/Normal distribution: Difference between revisions

m
→‎{{header|REXX}}: increased decimal digits, added whitespace and comments, elided 2nd graph, optimized some functions.
(Added Perl example)
m (→‎{{header|REXX}}: increased decimal digits, added whitespace and comments, elided 2nd graph, optimized some functions.)
Line 2,377:
 
=={{header|REXX}}==
The REXX language doesn't have any "higher math" BIF functions like SIN/, COS/, LN/, LOG/, SQRT/, POW/, etc,
<br>so we hoi polloi programmers have to roll our own.
<lang rexx>/*REXX program generates 10,000 normally distributed numbers (Gaussian distribution).*/
numeric digits 20 /*use 20 decimal digits for accuracy.*/
parse arg n seed . /*obtain optional arguments from the CL*/
if n=='' | n=="," then n=10000 10000 /*Not specified? Then use the default.*/
if datatype(seed, 'W') then call random ,,seed /*seed is for repeatable RANDOM numbers*/
call pi /*call subroutine to define pi constant*/
do g=1 for n; #.g= sqrt( -2 * ln( rand() ) ) * cos( 2 * pi * rand() )
end /*g*/ /* [↑] uniform random number ───► #.g */
s= 0
mn= #.1; mx= mn; noise= n * .0005 /*calculate the noise: 1/20th % of N.*/
ss= 0
do j=1 for n; _=#.j; s=s+_; ss=ss+_*_ /*the sum, and the sum of squares. */
mn= min(mn, _); mx= max(mx, _) /*find the minimum and the maximum. */
end /*j*/
!.= 0
say 'number of data points = ' aa(n )
say ' minimum = ' aa(mn )
Line 2,398 ⟶ 2,399:
say ' arithmetic mean = ' aa(s/n)
say ' standard deviation = ' aa(sqrt( ss/n - (s/n) **2) )
?mn= !.1; ?mx= ?mn /*define minimum & maximum value so far*/
parse value scrSize() with sd sw . /*obtain the (true) screen size of term*/ /*◄──not all REXXes have this BIF*/
sdE= sd - 4 /*the effective (useable) screen depth.*/
swE= sw - 1 /* " " " " width.*/
$= 1 / max(1, mx-mn) * sdE /*$ is used for scaling depth of histo*/
do i=1 for n; ?= trunc( (#.i-mn) * $) /*calculate the relative line.*/
!.?= !.? + 1 /*bump the counter. */
?mn= min(?mn, !.?); ?mx= max(?mx, !.?) /*find the minimum and maximum*/
end /*i*/
f=swE/?mx /*limit graph to 1 full screen*/
do h=0 for sdE; _= !.h /*obtain a data point. */
if _>noise then say copies('─', trunc(_*f) ) /*display a bar of histogram. */
end /*h*/ /*[↑] use a hyphen for histo.*/
Line 2,414 ⟶ 2,415:
/*──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────*/
aa: parse arg a; return left('', (a>=0) + 2 * datatype(a, 'W'))a /*prepend a blank if #>=0, add 2 blanks if whole.*/
e: e = 2.7182818284590452353602874713526624977572470936999595749669676277240766303535; return e
pi: pi= 3.1415926535897932384626433832795028841971693993751058209749445923078164062862; return pi
r2r: return arg(1) // (pi() * 2) /*normalize the given angle (in radians) to ±2pi.*/
rand: return random(1, 1e5) / 1e5 1e5 /*REXX generates uniform random postive integers.*/
.sincos: parse arg z,_,i; x= x*x; p= z; do k=2 by 2; _= -_*x/(k*(k+i)); z= z+_; if z=p then leave; p= z; end; return z
ln: procedure; parse arg x,f; call e; ig=x>1.5; is=1-2*(ig\==1); ii=0; xx=x; return .ln()
.ln: do while ig&xx>1.5|\ig&xx<.5;_=e; do k=-1;iz=xx*_**-is;if k>=0&(ig&iz<1|\ig&iz>.5) then leave; _=_*_;izz=iz; end
xx=izz;ii=ii+is*2**k;end; x=x*e**-ii-1;z=0;_=-1;p=z; do k=1;_=-_*x;z=z+_/k;if z=p then leave;p=z;end; return z+ii
/*──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────*/
cosln: procedure; parse arg x,f; x=r2r(x);call a=abs(x)e; hpiig=pi* x>1.5; is= numeric fuzz1 min(6,digits()-32*(ig\==1); ifii= a0; xx=pi() x; then returndo -while ig & xx>1.5 | \ig & xx<.5
if_= ae; do k=hpi|a-1; iz=hpi xx*3_ then return 0**-is; if ak>=pi0 & ()/3ig then& returniz<1 | \ig & iz>.5) then leave; if a_=pi() _*2/3_; thenizz= returniz; -.5end; return .sinCos(1,1,-1)xx= izz
ii= ii +is*2**k; end; x= x*e**-ii-1; z=0; _=-1; p=z; do k=1;_=-_*x;z=z+_/k;if z=p then leave;p=z;end; return z+ii
/*──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────*/
sqrtcos: procedure; parse arg x; if x=0 then return 0r2r(x); da=digitsabs(x); hpi= mpi*.=95; numeric fuzz min(6, digits()-3); if a=pi numeric form;then return h=d+6-1
if a=hpi | a=hpi*3 then return 0; if a=pi/3 then return .5; if a=pi*2/3 then return -.5; return .sinCos(1,1,-1)
/*──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────*/
sqrt: procedure; parse arg x; if x=0 then return 0; d= digits(); m.= 9; numeric digits; numeric form; h= d+6
parse value format(x,2,1,,0) 'E0' with g 'E' _ .; g=g*.5'e'_%2; do j=0 while h>9; m.j=h; h=h%2+1; end /*j*/
do k=j+5 to 0 by -1; numeric digits m.k; g=(g+x/g)*.5; end /*k*/; numeric digits d; return g/1</lang>
Line 2,435 ⟶ 2,437:
{{out|output|text=&nbsp; when using the default input:}}
 
<br>(The output shown when the screen size is 50x8062<small>x</small>140.)
<pre>
number of data points = 10000
minimum = -3.415718948181072371544448250
maximum = 3.967529045445917138265268562
arithmetic mean = -0.015091030601406470979976873427
standard deviation = 0.9905645899486092191249231518
 
 
───
────
─────
───────
───────
────────────
─────────────────
─────────────────────
─────────────────────────────
────────────────────────────────────
───────────────────────────────────────────
───────────────────────────────────────────────
──────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────
──────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────
───────────────────────────────────────────────────────────────────
───────────────────────────────────────────────────────────────────────────────
─────────────────────────────────────────────────────────────────────────
───────────────────────────────────────────────────────────────────────
──────────────────────────────────────────────────────────────────
───────────────────────────────────────────────────────────
───────────────────────────────────────────────────
─────────────────────────────────────────────
───────────────────────────────────────
───────────────────────────────
─────────────────────────────
──────────────────
─────────────
────────
───────
────
───
</pre>
'''output''' &nbsp; when using the default input:
<br>(The output shown when the screen size is 60x130.)
<pre>
number of data points = 10000
minimum = -3.83073183
maximum = 3.61051026
arithmetic mean = 0.00421997333
standard deviation = 0.981924955
──
──
────
──
─────
────────
────────
────────
───────────
──────────────
─────────────────────
──────────────────
──────────────────────
────────────────────
──────────────────────────────────
────────────────────────────
────────────────────────────────────────
─────────────────────────────────
────────────────────────────────
─────────────────────────────────────────────
───────────────────────────────────────────────
─────────────────────────────────────────────────────
───────────────────────────────────────────────────
─────────────────────────────────────────────────────────────────────────
─────────────────────────────────────────────────────────────────
─────────────────────────────────────────────────────────────────────────────────────
─────────────────────────────────────────────────────────────────
──────────────────────────────────────────────────────────────────────────────────────────────────
─────────────────────────────────────────────────────────────────
──────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────
───────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
──────────────────────────────────────────────────────────────────────────────────────────────────────────
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────────────────────
──────────────────────────────────────────────────────────────────────────────────────────────────
───────────────────────────────────────────────────────────────────────────────────────────────
──────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────
───────────────────────────────────────────────────────────────────────
───────────────────────────────────────────────────────────────────────────────────────────
───────────────────────────────────────────────────────────────────
──────────────────────────────────────────────────────────────────────────────────────
─────────────────────────────────────────────────────
──────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────
─────────────────────────────────────────────────
─────────────────────────────────
───────────────────────────────────
──────────────────────────────────
──────────────────────────────────────
───────────────────────
───────────────────────────────────
───────────────────────────
───────────────────
──────────────────────
──────────────────
─────────────
───────────
──────────
───────
──────
───────
───
────
───
──
</pre>