@@ -142,6 +142,92 @@ func TestMathExtra(t *testing.T) {
142142 {"Erfc(NaN)" , QuietNaN , 0 , 0 , QuietNaN , Erfc },
143143 {"Erfc(Inf)" , PositiveInfinity , 0 , 0 , FromFloat32 (0 ), Erfc },
144144 {"Erfc(-Inf)" , NegativeInfinity , 0 , 0 , FromInt (2 ), Erfc },
145+
146+ // Pow
147+ {"Pow(2, 3)" , FromFloat32 (2 ), FromFloat32 (3 ), 0 , FromFloat32 (8 ), Pow },
148+ {"Pow(0, -1)" , FromFloat32 (0 ), FromFloat32 (- 1 ), 0 , PositiveInfinity , Pow },
149+ {"Pow(Inf, -1)" , PositiveInfinity , FromFloat32 (- 1 ), 0 , FromFloat32 (0 ), Pow },
150+ {"Pow(NaN, 1)" , QuietNaN , FromFloat32 (1 ), 0 , QuietNaN , Pow },
151+
152+ // Exp
153+ {"Exp(0)" , FromFloat32 (0 ), 0 , 0 , FromFloat32 (1 ), Exp },
154+ {"Exp(1)" , FromFloat32 (1 ), 0 , 0 , ToFloat16 (float32 (math .Exp (1 ))), Exp },
155+ {"Exp(Inf)" , PositiveInfinity , 0 , 0 , PositiveInfinity , Exp },
156+ {"Exp(-Inf)" , NegativeInfinity , 0 , 0 , FromFloat32 (0 ), Exp },
157+ {"Exp(NaN)" , QuietNaN , 0 , 0 , QuietNaN , Exp },
158+
159+ // Exp2
160+ {"Exp2(0)" , FromFloat32 (0 ), 0 , 0 , FromFloat32 (1 ), Exp2 },
161+ {"Exp2(1)" , FromFloat32 (1 ), 0 , 0 , FromFloat32 (2 ), Exp2 },
162+ {"Exp2(Inf)" , PositiveInfinity , 0 , 0 , PositiveInfinity , Exp2 },
163+ {"Exp2(-Inf)" , NegativeInfinity , 0 , 0 , FromFloat32 (0 ), Exp2 },
164+ {"Exp2(NaN)" , QuietNaN , 0 , 0 , QuietNaN , Exp2 },
165+
166+ // Log
167+ {"Log(1)" , FromFloat32 (1 ), 0 , 0 , FromFloat32 (0 ), Log },
168+ {"Log(0)" , FromFloat32 (0 ), 0 , 0 , NegativeInfinity , Log },
169+ {"Log(-1)" , FromFloat32 (- 1 ), 0 , 0 , QuietNaN , Log },
170+ {"Log(Inf)" , PositiveInfinity , 0 , 0 , PositiveInfinity , Log },
171+ {"Log(NaN)" , QuietNaN , 0 , 0 , QuietNaN , Log },
172+
173+ // Log2
174+ {"Log2(1)" , FromFloat32 (1 ), 0 , 0 , FromFloat32 (0 ), Log2 },
175+ {"Log2(0)" , FromFloat32 (0 ), 0 , 0 , NegativeInfinity , Log2 },
176+ {"Log2(-1)" , FromFloat32 (- 1 ), 0 , 0 , QuietNaN , Log2 },
177+ {"Log2(Inf)" , PositiveInfinity , 0 , 0 , PositiveInfinity , Log2 },
178+ {"Log2(NaN)" , QuietNaN , 0 , 0 , QuietNaN , Log2 },
179+
180+ // Log10
181+ {"Log10(1)" , FromFloat32 (1 ), 0 , 0 , FromFloat32 (0 ), Log10 },
182+ {"Log10(0)" , FromFloat32 (0 ), 0 , 0 , NegativeInfinity , Log10 },
183+ {"Log10(-1)" , FromFloat32 (- 1 ), 0 , 0 , QuietNaN , Log10 },
184+ {"Log10(Inf)" , PositiveInfinity , 0 , 0 , PositiveInfinity , Log10 },
185+ {"Log10(NaN)" , QuietNaN , 0 , 0 , QuietNaN , Log10 },
186+
187+ // Sin
188+ {"Sin(0)" , FromFloat32 (0 ), 0 , 0 , FromFloat32 (0 ), Sin },
189+ {"Sin(Pi/2)" , Div (Pi , FromInt (2 )), 0 , 0 , FromFloat32 (1 ), Sin },
190+ {"Sin(NaN)" , QuietNaN , 0 , 0 , QuietNaN , Sin },
191+
192+ // Cos
193+ {"Cos(0)" , FromFloat32 (0 ), 0 , 0 , FromFloat32 (1 ), Cos },
194+ {"Cos(Pi)" , Pi , 0 , 0 , FromFloat32 (- 1 ), Cos },
195+ {"Cos(NaN)" , QuietNaN , 0 , 0 , QuietNaN , Cos },
196+
197+ // Tan
198+ {"Tan(0)" , FromFloat32 (0 ), 0 , 0 , FromFloat32 (0 ), Tan },
199+ {"Tan(Pi/4)" , Pi , 0 , 0 , FromFloat32 (0 ), Tan },
200+ {"Tan(NaN)" , QuietNaN , 0 , 0 , QuietNaN , Tan },
201+
202+ // Floor
203+ {"Floor(1.5)" , FromFloat32 (1.5 ), 0 , 0 , FromFloat32 (1 ), Floor },
204+ {"Floor(-1.5)" , FromFloat32 (- 1.5 ), 0 , 0 , FromFloat32 (- 2 ), Floor },
205+ {"Floor(NaN)" , QuietNaN , 0 , 0 , QuietNaN , Floor },
206+
207+ // Ceil
208+ {"Ceil(1.5)" , FromFloat32 (1.5 ), 0 , 0 , FromFloat32 (2 ), Ceil },
209+ {"Ceil(-1.5)" , FromFloat32 (- 1.5 ), 0 , 0 , FromFloat32 (- 1 ), Ceil },
210+ {"Ceil(NaN)" , QuietNaN , 0 , 0 , QuietNaN , Ceil },
211+
212+ // Round
213+ {"Round(1.5)" , FromFloat32 (1.5 ), 0 , 0 , FromFloat32 (2 ), Round },
214+ {"Round(1.4)" , FromFloat32 (1.4 ), 0 , 0 , FromFloat32 (1 ), Round },
215+ {"Round(NaN)" , QuietNaN , 0 , 0 , QuietNaN , Round },
216+
217+ // Trunc
218+ {"Trunc(1.5)" , FromFloat32 (1.5 ), 0 , 0 , FromFloat32 (1 ), Trunc },
219+ {"Trunc(-1.5)" , FromFloat32 (- 1.5 ), 0 , 0 , FromFloat32 (- 1 ), Trunc },
220+ {"Trunc(NaN)" , QuietNaN , 0 , 0 , QuietNaN , Trunc },
221+
222+ // Mod
223+ {"Mod(5, 3)" , FromFloat32 (5 ), FromFloat32 (3 ), 0 , FromFloat32 (2 ), Mod },
224+ {"Mod(5, 0)" , FromFloat32 (5 ), FromFloat32 (0 ), 0 , QuietNaN , Mod },
225+ {"Mod(NaN, 1)" , QuietNaN , FromFloat32 (1 ), 0 , QuietNaN , Mod },
226+
227+ // Hypot
228+ {"Hypot(3, 4)" , FromFloat32 (3 ), FromFloat32 (4 ), 0 , FromFloat32 (5 ), Hypot },
229+ {"Hypot(Inf, 4)" , PositiveInfinity , FromFloat32 (4 ), 0 , PositiveInfinity , Hypot },
230+ {"Hypot(NaN, 4)" , QuietNaN , FromFloat32 (4 ), 0 , QuietNaN , Hypot },
145231 }
146232
147233 for _ , tc := range testCases {
@@ -155,13 +241,18 @@ func TestMathExtra(t *testing.T) {
155241 case func (Float16 , Float16 , Float16 ) Float16 :
156242 res = op (tc .f , tc .f2 , tc .f3 )
157243 }
158- if res .Bits () != tc .expected .Bits () {
244+ if tc .expected .IsNaN () {
245+ if ! res .IsNaN () {
246+ t .Errorf ("Expected NaN, got %v" , res )
247+ }
248+ } else if Abs (Sub (res , tc .expected )).ToFloat32 () > 1e-3 {
159249 t .Errorf ("Expected %v, got %v" , tc .expected , res )
160250 }
161251 })
162252 }
163253}
164254
255+
165256func TestLgamma (t * testing.T ) {
166257 testCases := []struct {
167258 name string
0 commit comments