diff options
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 | 
