1function gbtest80
2%GBTEST80 test complex division and power
3% Tests all real, inf, and nan cases.
4
5% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved.
6% SPDX-License-Identifier: GPL-3.0-or-later
7
8list = [-2:0.5:2 inf -inf nan] ;
9
10fprintf ('gbtest80: test complex division and power') ;
11
12maxerr = 0 ;
13maxerr_single = 0 ;
14stol = 1e-5 ;
15dtol = 1e-14 ;
16
17for xr = list
18    fprintf ('\n%g ', xr) ;
19    % fprintf ('\n------------------------------------------\n') ;
20    for xi = list
21        fprintf ('.')
22        % fprintf ('\n') ;
23        X = complex (xr, xi) ;
24        GX = GrB (X) ;
25        Xs = single (X) ;
26        GXs = GrB (Xs) ;
27
28        for yr = list
29            for yi = list
30
31                Y = complex (yr, yi) ;
32                GY = GrB (Y) ;
33                Ys = single (Y) ;
34                GYs = GrB (Ys) ;
35
36                Z = X / Y ;
37                Z2 = GX / GY ;
38                [err, errnan] = gbtest_err (Z, Z2) ;
39                znorm = abs (Z) ;
40                if (znorm > 1)
41                    err = err / znorm ;
42                end
43                if (~errnan)
44                    maxerr = max (maxerr, err) ;
45                end
46                if (err > dtol)
47                    fprintf ('(%g,%g) / (%g,%g) = (%g,%g) (%g,%g)', ...
48                        xr, xi, yr, yi, real (Z), imag (Z), ...
49                        real (Z2), imag (Z2)) ;
50                    fprintf (' err: %g', err) ;
51                    fprintf (' DOUBLE DIFFERS') ;
52                    fprintf ('\n') ;
53                    % pause
54                end
55
56                Z = Xs / Ys ;
57                Z2 = GXs / GYs ;
58                [err, errnan] = gbtest_err (Z, Z2) ;
59                znorm = abs (Z) ;
60                if (znorm > 1)
61                    err = err / znorm ;
62                end
63                if (~errnan)
64                    maxerr_single = max (maxerr_single, err) ;
65                end
66                if (err > stol)
67                    fprintf ('(%g,%g) / (%g,%g) = (%g,%g) (%g,%g)', ...
68                        xr, xi, yr, yi, real (Z), imag (Z), ...
69                        real (Z2), imag (Z2)) ;
70                    fprintf (' err: %g', err) ;
71                    fprintf (' SINGLE DIFFERS') ;
72                    fprintf ('\n') ;
73                    % pause
74                end
75
76                Z = X .^ Y ;
77                Z2 = GX .^ GY ;
78                [err, errnan] = gbtest_err (Z, Z2) ;
79                znorm = abs (Z) ;
80                if (znorm > 1)
81                    err = err / znorm ;
82                end
83                if (~errnan)
84                    maxerr = max (maxerr, err) ;
85                end
86                if (err > dtol)
87                    fprintf ('(%g,%g) .^ (%g,%g) = (%g,%g) (%g,%g)', ...
88                        xr, xi, yr, yi, real (Z), imag (Z), ...
89                        real (Z2), imag (Z2)) ;
90                    fprintf (' err: %g', err) ;
91                    fprintf (' DOUBLE DIFFERS') ;
92                    fprintf ('\n') ;
93                    % pause
94                end
95
96                Z = Xs .^ Ys ;
97                Z2 = GXs .^ GYs ;
98                [err, errnan] = gbtest_err (Z, Z2) ;
99                znorm = abs (Z) ;
100                if (znorm > 1)
101                    err = err / znorm ;
102                end
103                if (~errnan)
104                    maxerr_single = max (maxerr_single, err) ;
105                end
106                if (err > stol)
107                    fprintf ('(%g,%g) .^ (%g,%g) = (%g,%g) (%g,%g)', ...
108                        xr, xi, yr, yi, real (Z), imag (Z), ...
109                        real (Z2), imag (Z2)) ;
110                    fprintf (' err: %g', err) ;
111                    fprintf (' SINGLE DIFFERS') ;
112                    fprintf ('\n') ;
113                    % pause
114                end
115
116            end
117        end
118    end
119end
120
121fprintf ('\nmaxerr: %g %g\n', maxerr, maxerr_single) ;
122assert (maxerr < dtol)
123assert (maxerr_single < stol)
124
125fprintf ('\ngbtest80: all tests passed\n') ;
126
127