diff options
| author | Craig Jennings <c@cjennings.net> | 2025-05-08 18:49:34 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2025-05-08 18:51:59 -0500 |
| commit | 000e00871830cd15de032c80e2b62946cf19445c (patch) | |
| tree | 794a7922750472bbe0e024042d6ba84f411fc3e0 /dotfiles/system/.zsh/modules/Test/V03mathfunc.ztst | |
| parent | fe302606931e4bad91c4ed6df81a4403523ba780 (diff) | |
adding missing dotfiles and folders
- profile.d/
- bashrc
- authinfo.gpg
- .zsh/
Diffstat (limited to 'dotfiles/system/.zsh/modules/Test/V03mathfunc.ztst')
| -rw-r--r-- | dotfiles/system/.zsh/modules/Test/V03mathfunc.ztst | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/dotfiles/system/.zsh/modules/Test/V03mathfunc.ztst b/dotfiles/system/.zsh/modules/Test/V03mathfunc.ztst new file mode 100644 index 0000000..1edb7a2 --- /dev/null +++ b/dotfiles/system/.zsh/modules/Test/V03mathfunc.ztst @@ -0,0 +1,141 @@ +# Tests for the module zsh/mathfunc + +%prep + if ! zmodload zsh/mathfunc 2>/dev/null; then + ZTST_unimplemented="The module zsh/mathfunc is not available." + fi + +%test + # -g makes pi available in later tests + float -gF 5 pi + (( pi = 4 * atan(1.0) )) + print $pi +0:Basic operation with atan +>3.14159 + + float -F 5 result + (( result = atan(3,2) )) + print $result +0:atan with two arguments +>0.98279 + + print $(( atan(1,2,3) )) +1:atan can't take three arguments +?(eval):1: wrong number of arguments: atan(1,2,3) + + float r1=$(( rand48() )) + float r2=$(( rand48() )) + float r3=$(( rand48() )) + # Yes, this is a floating point equality test like they tell + # you not to do. As the pseudrandom sequence is deterministic, + # this is the right thing to do in this case. + if (( r1 == r2 )); then + print "Seed not updated correctly the first time" + else + print "First two random numbers differ, OK" + fi + if (( r2 == r3 )); then + print "Seed not updated correctly the second time" + else + print "Second two random numbers differ, OK" + fi +0:rand48 with default initialisation +F:This test fails if your math library doesn't have erand48(). +>First two random numbers differ, OK +>Second two random numbers differ, OK + + seed=f45677a6cbe4 + float r1=$(( rand48(seed) )) + float r2=$(( rand48(seed) )) + seed2=$seed + float r3=$(( rand48(seed) )) + float r4=$(( rand48(seed2) )) + # Yes, this is a floating point equality test like they tell + # you not to do. As the pseudrandom sequence is deterministic, + # this is the right thing to do in this case. + if (( r1 == r2 )); then + print "Seed not updated correctly the first time" + else + print "First two random numbers differ, OK" + fi + if (( r2 == r3 )); then + print "Seed not updated correctly the second time" + else + print "Second two random numbers differ, OK" + fi + if (( r3 == r4 )); then + print "Identical seeds generate identical numbers, OK" + else + print "Indeterminate result from identical seeds" + fi +0:rand48 with pre-generated seed +F:This test fails if your math library doesn't have erand48(). +>First two random numbers differ, OK +>Second two random numbers differ, OK +>Identical seeds generate identical numbers, OK + + float -F 5 pitest + (( pitest = 4.0 * atan(1) )) + # This is a string test of the output to 5 digits. + if [[ $pi = $pitest ]]; then + print "OK, atan on an integer seemed to work" + else + print "BAD: got $pitest instead of $pi" + fi +0:Conversion of arguments from integer +>OK, atan on an integer seemed to work + + float -F 5 result + typeset str + for str in 0 0.0 1 1.5 -1 -1.5; do + (( result = abs($str) )) + print $result + done +0:Use of abs on various numbers +>0.00000 +>0.00000 +>1.00000 +>1.50000 +>1.00000 +>1.50000 + + print $(( sqrt(-1) )) +1:Non-negative argument checking for square roots. +?(eval):1: math: argument to sqrt out of range + +# Simple test that the pseudorandom number generators are producing +# something that could conceivably be pseudorandom numbers in a +# linear range. Not a detailed quantitative verification. + integer N=10000 isource ok=1 + float -F f sum sumsq max max2 av sd + typeset -a randoms + randoms=('f = RANDOM' 'f = rand48()') + for isource in 1 2; do + (( sum = sumsq = max = 0 )) + repeat $N; do + let $randoms[$isource] + (( f > max )) && (( max = f )) + (( sum += f, sumsq += f * f )) + done + (( av = sum / N )) + (( sd = sqrt((sumsq - N * av * av) / (N-1)) )) + (( max2 = 0.5 * max )) + if (( av > max2 * 1.1 )) || (( av < max2 * 0.9 )); then + print "WARNING: average of random numbers is suspicious. + Was testing: $randoms[$isource]" + (( ok = 0 )) + fi + if (( sd < max / 4 )); then + print "WARNING: distribution of random numbers is suspicious. + Was testing: $randoms[$isource]" + (( ok = 0 )) + fi + done + (( ok )) +0:Test random number generator distributions are not grossly broken + + float -F 5 g l + (( g = gamma(2), l = lgamma(2) )) + print $g, $l +0:Test Gamma function gamma and lgamma +>1.00000, 0.00000 |
