Raymond Toy pushed to branch issue-425-correctly-rounded-math-functions-single-float at cmucl / cmucl

Commits:

1 changed file:

Changes:

  • tests/fdlibm.lisp
    ... ... @@ -1062,6 +1062,14 @@
    1062 1062
       (assert-equal 1d0
    
    1063 1063
     		(kernel:%pow ext:double-float-negative-infinity 0d0)))
    
    1064 1064
     
    
    1065
    +(define-test %powf.case.1
    
    1066
    +    (:tag :fdlibm)
    
    1067
    +  ;; anything ^ 0 is 1
    
    1068
    +  (assert-equal 1f0
    
    1069
    +		(kernel:%powf ext:single-float-positive-infinity 0f0))
    
    1070
    +  (assert-equal 1f0
    
    1071
    +		(kernel:%powf ext:single-float-negative-infinity 0f0)))
    
    1072
    +
    
    1065 1073
     (define-test %pow.case.2
    
    1066 1074
         (:tag :fdlibm)
    
    1067 1075
       ;; anything ^ 1 is itself
    
    ... ... @@ -1070,6 +1078,14 @@
    1070 1078
       (assert-equal ext:double-float-negative-infinity
    
    1071 1079
     		(kernel:%pow ext:double-float-negative-infinity 1d0)))
    
    1072 1080
     
    
    1081
    +(define-test %powf.case.2
    
    1082
    +    (:tag :fdlibm)
    
    1083
    +  ;; anything ^ 1 is itself
    
    1084
    +  (assert-equal ext:single-float-positive-infinity
    
    1085
    +		(kernel:%powf ext:single-float-positive-infinity 1f0))
    
    1086
    +  (assert-equal ext:single-float-negative-infinity
    
    1087
    +		(kernel:%powf ext:single-float-negative-infinity 1f0)))
    
    1088
    +
    
    1073 1089
     (define-test %pow.case.3
    
    1074 1090
         (:tag :fdlibm)
    
    1075 1091
       ;; anything ^ NaN is NaN
    
    ... ... @@ -1078,6 +1094,14 @@
    1078 1094
       (assert-true (ext:float-nan-p
    
    1079 1095
     		(kernel:%pow ext:double-float-positive-infinity *qnan*))))
    
    1080 1096
     
    
    1097
    +(define-test %powf.case.3
    
    1098
    +    (:tag :fdlibm)
    
    1099
    +  ;; anything ^ NaN is NaN
    
    1100
    +  (assert-true (ext:float-nan-p
    
    1101
    +		(kernel:%powf (float pi 1f0) *qnan-single-float*)))
    
    1102
    +  (assert-true (ext:float-nan-p
    
    1103
    +		(kernel:%powf ext:single-float-positive-infinity *qnan-single-float*))))
    
    1104
    +
    
    1081 1105
     (define-test %pow.case.4
    
    1082 1106
         (:tag :fdlibm)
    
    1083 1107
       ;; NaN ^ non-zero is NaN
    
    ... ... @@ -1086,6 +1110,14 @@
    1086 1110
       (assert-true (ext:float-nan-p
    
    1087 1111
     		(kernel:%pow *qnan* ext:double-float-positive-infinity))))
    
    1088 1112
     
    
    1113
    +(define-test %powf.case.4
    
    1114
    +    (:tag :fdlibm)
    
    1115
    +  ;; NaN ^ non-zero is NaN
    
    1116
    +  (assert-true (ext:float-nan-p
    
    1117
    +		(kernel:%powf *qnan-single-float* (float pi 1f0))))
    
    1118
    +  (assert-true (ext:float-nan-p
    
    1119
    +		(kernel:%powf *qnan-single-float* ext:single-float-positive-infinity))))
    
    1120
    +
    
    1089 1121
     (define-test %pow.case.5
    
    1090 1122
         (:tag :fdlibm)
    
    1091 1123
       ;; (|x| > 1) ^ +inf is +inf
    
    ... ... @@ -1094,6 +1126,14 @@
    1094 1126
       (assert-equal ext:double-float-positive-infinity
    
    1095 1127
     		(kernel:%pow (- pi) ext:double-float-positive-infinity)))
    
    1096 1128
     
    
    1129
    +(define-test %powf.case.5
    
    1130
    +    (:tag :fdlibm)
    
    1131
    +  ;; (|x| > 1) ^ +inf is +inf
    
    1132
    +  (assert-equal ext:single-float-positive-infinity
    
    1133
    +		(kernel:%powf (float pi 1f0) ext:single-float-positive-infinity))
    
    1134
    +  (assert-equal ext:single-float-positive-infinity
    
    1135
    +		(kernel:%powf (float (- pi) 1f0) ext:single-float-positive-infinity)))
    
    1136
    +
    
    1097 1137
     (define-test %pow.case.6
    
    1098 1138
         (:tag :fdlibm)
    
    1099 1139
       ;; (|x| > 1) ^ -inf is +0
    
    ... ... @@ -1102,6 +1142,14 @@
    1102 1142
       (assert-equal +0d0
    
    1103 1143
     		(kernel:%pow (- pi) ext:double-float-negative-infinity)))
    
    1104 1144
     
    
    1145
    +(define-test %powf.case.6
    
    1146
    +    (:tag :fdlibm)
    
    1147
    +  ;; (|x| > 1) ^ -inf is +0
    
    1148
    +  (assert-equal +0f0
    
    1149
    +		(kernel:%powf (float pi 1f0) ext:single-float-negative-infinity))
    
    1150
    +  (assert-equal +0f0
    
    1151
    +		(kernel:%powf (float (- pi) 1f0) ext:single-float-negative-infinity)))
    
    1152
    +
    
    1105 1153
     (define-test %pow.case.7
    
    1106 1154
         (:tag :fdlibm)
    
    1107 1155
       ;; (|x| < 1) ^ +inf is +0
    
    ... ... @@ -1110,6 +1158,14 @@
    1110 1158
       (assert-equal +0d0
    
    1111 1159
     		(kernel:%pow -0.5d0 ext:double-float-positive-infinity)))
    
    1112 1160
     
    
    1161
    +(define-test %powf.case.7
    
    1162
    +    (:tag :fdlibm)
    
    1163
    +  ;; (|x| < 1) ^ +inf is +0
    
    1164
    +  (assert-equal +0f0
    
    1165
    +		(kernel:%powf 0.5f0 ext:single-float-positive-infinity))
    
    1166
    +  (assert-equal +0f0
    
    1167
    +		(kernel:%powf -0.5f0 ext:single-float-positive-infinity)))
    
    1168
    +
    
    1113 1169
     (define-test %pow.case.8
    
    1114 1170
         (:tag :fdlibm)
    
    1115 1171
       ;; (|x| < 1) ^ -inf is +inf
    
    ... ... @@ -1118,6 +1174,14 @@
    1118 1174
       (assert-equal ext:double-float-positive-infinity
    
    1119 1175
     		(kernel:%pow -0.5d0 ext:double-float-negative-infinity)))
    
    1120 1176
     
    
    1177
    +(define-test %powf.case.8
    
    1178
    +    (:tag :fdlibm)
    
    1179
    +  ;; (|x| < 1) ^ -inf is +inf
    
    1180
    +  (assert-equal ext:single-float-positive-infinity
    
    1181
    +		(kernel:%powf 0.5f0 ext:single-float-negative-infinity))
    
    1182
    +  (assert-equal ext:single-float-positive-infinity
    
    1183
    +		(kernel:%powf -0.5f0 ext:single-float-negative-infinity)))
    
    1184
    +
    
    1121 1185
     (define-test %pow.case.9
    
    1122 1186
         (:tag :fdlibm)
    
    1123 1187
       ;; std::pow says 1^exp is 1 for any exp, including NaN.  (-1)^(+/-inf)
    
    ... ... @@ -1159,6 +1223,47 @@
    1159 1223
         (assert-true (ext:float-nan-p
    
    1160 1224
     		  (kernel:%pow -1d0 ext:double-float-negative-infinity))))))
    
    1161 1225
     
    
    1226
    +(define-test %powf.case.9
    
    1227
    +    (:tag :fdlibm)
    
    1228
    +  ;; std::pow says 1^exp is 1 for any exp, including NaN.  (-1)^(+/-inf)
    
    1229
    +  ;; is 1.  No errors signaled.
    
    1230
    +  #+core-math
    
    1231
    +  (progn
    
    1232
    +    (assert-equal 1f0
    
    1233
    +		  (kernel:%powf 1f0 ext:single-float-positive-infinity))
    
    1234
    +    (assert-equal 1f0
    
    1235
    +		  (kernel:%powf 1f0 ext:single-float-negative-infinity))
    
    1236
    +    (assert-equal 1f0
    
    1237
    +		  (kernel:%powf 1f0 *qnan-single-float*))
    
    1238
    +    (assert-equal 1f0
    
    1239
    +		  (kernel:%powf -1f0 ext:single-float-positive-infinity))
    
    1240
    +    (assert-equal 1f0
    
    1241
    +		  (kernel:%powf -1f0 ext:single-float-negative-infinity)))
    
    1242
    +  #-core-math
    
    1243
    +  ;; +-1 ^ +-inf is NaN.
    
    1244
    +  ;;
    
    1245
    +  ;; But the implementation signals invalid operation, so we need to
    
    1246
    +  ;; check for that.
    
    1247
    +  ;;
    
    1248
    +  (progn
    
    1249
    +    (assert-error 'floating-point-invalid-operation
    
    1250
    +		  (kernel:%powf 1f0 ext:single-float-positive-infinity))
    
    1251
    +    (assert-error 'floating-point-invalid-operation
    
    1252
    +		  (kernel:%powf 1f0 ext:single-float-negative-infinity))
    
    1253
    +    (assert-error 'floating-point-invalid-operation
    
    1254
    +		  (kernel:%powf -1f0 ext:single-float-positive-infinity))
    
    1255
    +    (assert-error 'floating-point-invalid-operation
    
    1256
    +		  (kernel:%powf -1f0 ext:single-float-negative-infinity))
    
    1257
    +    (ext:with-float-traps-masked (:invalid)
    
    1258
    +      (assert-true (ext:float-nan-p
    
    1259
    +		    (kernel:%powf 1f0 ext:single-float-positive-infinity)))
    
    1260
    +      (assert-true (ext:float-nan-p
    
    1261
    +		    (kernel:%powf 1f0 ext:single-float-negative-infinity)))
    
    1262
    +      (assert-true (ext:float-nan-p
    
    1263
    +		    (kernel:%powf -1f0 ext:single-float-positive-infinity)))
    
    1264
    +      (assert-true (ext:float-nan-p
    
    1265
    +		    (kernel:%powf -1f0 ext:single-float-negative-infinity))))))
    
    1266
    +
    
    1162 1267
     (define-test %pow.case.10
    
    1163 1268
         (:tag :fdlibm)
    
    1164 1269
       ;; +0 ^ (+anything except 0, Nan) is +0
    
    ... ... @@ -1167,6 +1272,14 @@
    1167 1272
       (assert-equal +0d0
    
    1168 1273
     		(kernel:%pow +0d0 ext:double-float-positive-infinity)))
    
    1169 1274
     
    
    1275
    +(define-test %powf.case.10
    
    1276
    +    (:tag :fdlibm)
    
    1277
    +  ;; +0 ^ (+anything except 0, Nan) is +0
    
    1278
    +  (assert-equal +0f0
    
    1279
    +		(kernel:%powf +0f0 10f0))
    
    1280
    +  (assert-equal +0f0
    
    1281
    +		(kernel:%powf +0f0 ext:single-float-positive-infinity)))
    
    1282
    +
    
    1170 1283
     (define-test %pow.case.11
    
    1171 1284
         (:tag :fdlibm)
    
    1172 1285
       ;; +0 ^ (+anything except 0, Nan, odd integer) is +0
    
    ... ... @@ -1175,6 +1288,14 @@
    1175 1288
       (assert-equal +0d0
    
    1176 1289
     		(kernel:%pow -0d0 ext:double-float-positive-infinity)))
    
    1177 1290
     
    
    1291
    +(define-test %powf.case.11
    
    1292
    +    (:tag :fdlibm)
    
    1293
    +  ;; +0 ^ (+anything except 0, Nan, odd integer) is +0
    
    1294
    +  (assert-equal +0f0
    
    1295
    +		(kernel:%powf -0f0 10f0))
    
    1296
    +  (assert-equal +0f0
    
    1297
    +		(kernel:%powf -0f0 ext:single-float-positive-infinity)))
    
    1298
    +
    
    1178 1299
     (define-test %pow.case.12
    
    1179 1300
         (:tag :fdlibm)
    
    1180 1301
       ;; +0 ^ (-anything except 0, Nan) is +inf
    
    ... ... @@ -1189,6 +1310,22 @@
    1189 1310
       (assert-equal ext:double-float-positive-infinity
    
    1190 1311
     		(kernel:%pow +0d0 ext:double-float-negative-infinity)))
    
    1191 1312
     
    
    1313
    +(define-test %powf.case.12
    
    1314
    +    (:tag :fdlibm)
    
    1315
    +  ;; +0 ^ (-anything except 0, Nan) is +inf
    
    1316
    +  ;;
    
    1317
    +  ;; But fdlibm signals error for (+0)^(-10) instead of returning inf.  Check this.
    
    1318
    +  #+nil
    
    1319
    +  (assert-error 'division-by-zero
    
    1320
    +		(kernel:%powf +0f0 -10f0))
    
    1321
    +  #+nil
    
    1322
    +  (ext:with-float-traps-masked (:divide-by-zero)
    
    1323
    +    (assert-equal ext:single-float-positive-infinity
    
    1324
    +		  (kernel:%powf +0f0 -10f0)))
    
    1325
    +  ;; No signals here.
    
    1326
    +  (assert-equal ext:single-float-positive-infinity
    
    1327
    +		(kernel:%powf +0f0 ext:single-float-negative-infinity)))
    
    1328
    +
    
    1192 1329
     (define-test %pow.case.13
    
    1193 1330
         (:tag :fdlibm)
    
    1194 1331
       ;; -0 ^ (-anything except 0, Nan, odd integer) is +inf
    
    ... ... @@ -1203,24 +1340,56 @@
    1203 1340
       (assert-equal ext:double-float-positive-infinity
    
    1204 1341
     		(kernel:%pow +0d0 ext:double-float-negative-infinity)))
    
    1205 1342
     
    
    1343
    +(define-test %powf.case.13
    
    1344
    +    (:tag :fdlibm)
    
    1345
    +  ;; -0 ^ (-anything except 0, Nan, odd integer) is +inf
    
    1346
    +  ;;
    
    1347
    +  ;; But (-0)^(-10) signals division by zero
    
    1348
    +  (assert-error 'division-by-zero
    
    1349
    +		(kernel:%powf -0f0 -10f0))
    
    1350
    +  (ext:with-float-traps-masked (:divide-by-zero)
    
    1351
    +    (assert-equal ext:single-float-positive-infinity
    
    1352
    +		  (kernel:%powf -0f0 -10f0)))
    
    1353
    +  ;; But no error here.
    
    1354
    +  (assert-equal ext:single-float-positive-infinity
    
    1355
    +		(kernel:%powf +0f0 ext:single-float-negative-infinity)))
    
    1356
    +
    
    1206 1357
     (define-test %pow.case.14
    
    1207 1358
         (:tag :fdlibm)
    
    1208 1359
       ;; -0 ^ (odd integer) = -( +0 ^ (odd integer))
    
    1209 1360
       (assert-equal (- (kernel:%pow +0d0 5d0))
    
    1210 1361
     		(kernel:%pow -0d0 5d0)))
    
    1211 1362
     
    
    1363
    +(define-test %powf.case.14
    
    1364
    +    (:tag :fdlibm)
    
    1365
    +  ;; -0 ^ (odd integer) = -( +0 ^ (odd integer))
    
    1366
    +  (assert-equal (- (kernel:%powf +0f0 5f0))
    
    1367
    +		(kernel:%powf -0f0 5f0)))
    
    1368
    +
    
    1212 1369
     (define-test %pow.case.15
    
    1213 1370
         (:tag :fdlibm)
    
    1214 1371
       ;; +inf ^ (+anything except 0, NaN) is +inf
    
    1215 1372
       (assert-equal ext:double-float-positive-infinity
    
    1216 1373
     		(kernel:%pow ext:double-float-positive-infinity pi)))
    
    1217 1374
     
    
    1375
    +(define-test %powf.case.15
    
    1376
    +    (:tag :fdlibm)
    
    1377
    +  ;; +inf ^ (+anything except 0, NaN) is +inf
    
    1378
    +  (assert-equal ext:single-float-positive-infinity
    
    1379
    +		(kernel:%powf ext:single-float-positive-infinity (float pi 1f0))))
    
    1380
    +
    
    1218 1381
     (define-test %pow.case.16
    
    1219 1382
         (:tag :fdlibm)
    
    1220 1383
       ;; +inf ^ (-anything except 0, NaN) is +0
    
    1221 1384
       (assert-equal +0d0
    
    1222 1385
     		(kernel:%pow ext:double-float-positive-infinity (- pi))))
    
    1223 1386
     
    
    1387
    +(define-test %powf.case.16
    
    1388
    +    (:tag :fdlibm)
    
    1389
    +  ;; +inf ^ (-anything except 0, NaN) is +0
    
    1390
    +  (assert-equal +0f0
    
    1391
    +		(kernel:%powf ext:single-float-positive-infinity (float (- pi) 1f0))))
    
    1392
    +
    
    1224 1393
     (define-test %pow.case.17
    
    1225 1394
         (:tag :fdlibm)
    
    1226 1395
       ;; -inf ^ (anything) = -0 ^ (-anything)
    
    ... ... @@ -1232,6 +1401,17 @@
    1232 1401
       (assert-equal (kernel:%pow -0d0 pi)
    
    1233 1402
     		(kernel:%pow ext:double-float-negative-infinity (- pi))))
    
    1234 1403
     
    
    1404
    +(define-test %powf.case.17
    
    1405
    +    (:tag :fdlibm)
    
    1406
    +  ;; -inf ^ (anything) = -0 ^ (-anything)
    
    1407
    +  (assert-equal (ext:with-float-traps-masked (:divide-by-zero)
    
    1408
    +		  ;; This produces a divide-by-zero error so mask it
    
    1409
    +		  ;; to get a value.
    
    1410
    +		  (kernel:%powf -0f0 (float (- pi) 1f0)))
    
    1411
    +		(kernel:%powf ext:single-float-negative-infinity (float pi 1f0)))
    
    1412
    +  (assert-equal (kernel:%powf -0f0 (float pi 1f0))
    
    1413
    +		(kernel:%powf ext:single-float-negative-infinity (float (- pi) 1f0))))
    
    1414
    +
    
    1235 1415
     (define-test %pow.case.18
    
    1236 1416
         (:tag :fdlibm)
    
    1237 1417
       ;; (-anything) ^ integer is (-1)^integer * (+anything ^ integer)
    
    ... ... @@ -1242,6 +1422,16 @@
    1242 1422
     		    (kernel:%pow base (coerce power 'double-float))
    
    1243 1423
     		    base power))))
    
    1244 1424
     
    
    1425
    +(define-test %powf.case.18
    
    1426
    +    (:tag :fdlibm)
    
    1427
    +  ;; (-anything) ^ integer is (-1)^integer * (+anything ^ integer)
    
    1428
    +  (dolist (base '(-2f0 -10f0))
    
    1429
    +    (dolist (power '(5 -5))
    
    1430
    +      (assert-equal (* (expt -1 power)
    
    1431
    +		       (kernel:%powf (- base) (coerce power 'single-float)))
    
    1432
    +		    (kernel:%powf base (coerce power 'single-float))
    
    1433
    +		    base power))))
    
    1434
    +
    
    1245 1435
     (define-test %pow.case.19
    
    1246 1436
         (:tag :fdlibm)
    
    1247 1437
       ;; (-anything except 0 and inf) ^ non-integer is NaN
    
    ... ... @@ -1252,3 +1442,14 @@
    1252 1442
       (ext:with-float-traps-masked (:invalid)
    
    1253 1443
         (assert-true (ext:float-nan-p
    
    1254 1444
     		  (kernel:%pow -2d0 1.5d0)))))
    
    1445
    +
    
    1446
    +(define-test %powf.case.19
    
    1447
    +    (:tag :fdlibm)
    
    1448
    +  ;; (-anything except 0 and inf) ^ non-integer is NaN
    
    1449
    +  ;;
    
    1450
    +  ;; But this signals invalid, so check for that too.
    
    1451
    +  (assert-error 'floating-point-invalid-operation
    
    1452
    +		(kernel:%powf -2f0 1.5f0))
    
    1453
    +  (ext:with-float-traps-masked (:invalid)
    
    1454
    +    (assert-true (ext:float-nan-p
    
    1455
    +		  (kernel:%powf -2f0 1.5f0)))))