Commit | Line | Data |
---|---|---|
58d76dfd JH |
1 | #!./perl -w |
2 | # Now they'll be wanting biff! and zap! tests too. | |
3 | ||
4 | BEGIN { | |
5 | chdir 't' if -d 't'; | |
6 | @INC = '../lib'; | |
7 | require './test.pl'; | |
8 | } | |
9 | ||
10 | # This calcualtion ought to be within 0.001 of the right answer. | |
11 | my $bits_in_uv = int (0.001 + log (~0+1) / log 2); | |
12 | ||
13 | # 3**30 < 2**48, don't trust things outside that range on a Cray | |
14 | # Likewise other 3 should not overflow 48 bits if I did my sums right. | |
15 | my @pow = ([3,30,1e-14], [4,32,0], [5,20,1e-14], [2.5, 10,,1e-14], [-2, 69,0]); | |
16 | my $tests; | |
17 | $tests += $_->[1] foreach @pow; | |
18 | ||
0615a994 SM |
19 | plan tests => 2 + $bits_in_uv + $tests; |
20 | ||
21 | # This gave positive 27 before change #20167 | |
22 | is((-3)**3, -27, "(negative int) ** (odd power) is negative"); | |
58d76dfd JH |
23 | |
24 | # Ought to be 32, 64, 36 or something like that. | |
25 | ||
26 | my $remainder = $bits_in_uv & 3; | |
27 | ||
28 | cmp_ok ($remainder, '==', 0, 'Sanity check bits in UV calculation') | |
29 | or printf "# ~0 is %d (0x%d) which gives $bits_in_uv bits\n", ~0, ~0; | |
30 | ||
31 | # These are a lot of brute force tests to see how accurate $m ** $n is. | |
32 | # Unfortunately rather a lot of perl programs expect 2 ** $n to be integer | |
33 | # perfect, forgetting that it's a call to floating point pow() which never | |
34 | # claims to deliver perfection. | |
35 | foreach my $n (0..$bits_in_uv - 1) { | |
36 | my $exp = 2 ** $n; | |
37 | my $int = 1 << $n; | |
38 | cmp_ok ($exp, '==', $int, "2 ** $n vs 1 << $n"); | |
39 | } | |
40 | ||
41 | foreach my $pow (@pow) { | |
42 | my ($base, $max, $range) = @$pow; | |
43 | my $fp = 1; | |
44 | foreach my $n (0..$max-1) { | |
45 | my $exp = $base ** $n; | |
46 | within ($exp, $fp, $range, "$base ** $n [$exp] vs $base * $base * ..."); | |
47 | $fp *= $base; | |
48 | } | |
49 | } |