Skip to content

Commit ef8a6a9

Browse files
authored
Get isfinite, isinf, and isnan right in jerry-math (#4497)
- `finite` is not C99 but a BSD fp classification function, so it is removed. - The standard specifies that `isnan` is a macro (just like `isfinite` and `isinf`), so the `isnan` function implementation is removed. - `isfinite` incorrectly classified NAN as finite, which is fixed. - `isinf` returned 1 for negative infinity. This is not a bug according to the standard, but is not aligned with recent glibc, which returns -1. This is changed to simplify testing. - Added test cases for `isfinite` and `isinf` to the unit test of jerry-math. - Added a new pass to unittests to ensure that jerry-math is tested. JerryScript-DCO-1.0-Signed-off-by: Akos Kiss [email protected]
1 parent c4676a2 commit ef8a6a9

File tree

8 files changed

+69
-111
lines changed

8 files changed

+69
-111
lines changed

jerry-math/CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,8 @@ set(SOURCE_MATH
4343
exp.c
4444
expm1.c
4545
fabs.c
46-
finite.c
4746
floor.c
4847
fmod.c
49-
isnan.c
5048
log.c
5149
log10.c
5250
log1p.c

jerry-math/finite.c

Lines changed: 0 additions & 41 deletions
This file was deleted.

jerry-math/include/math.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ extern "C"
2727
#define HUGE_VAL INFINITY
2828

2929
#define isnan(x) ((x) != (x))
30-
#define isinf(x) (((x) == INFINITY) || ((x) == -INFINITY))
31-
#define isfinite(x) (!(isinf(x)) && (x != NAN))
30+
#define isinf(x) ((x) == INFINITY ? 1 : (x) == -INFINITY ? -1 : 0)
31+
#define isfinite(x) (!isinf(x) && !isnan(x))
3232

3333
/* Exponential and Logarithmic constants. */
3434
#define M_E 2.7182818284590452353602874713526625

jerry-math/isnan.c

Lines changed: 0 additions & 44 deletions
This file was deleted.

jerry-math/jerry-math-internal.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,6 @@ double fabs (double x);
112112
double floor (double x);
113113
double fmod (double x, double y);
114114

115-
int isnan (double x);
116-
int finite (double x);
117-
118115
double nextafter (double x, double y);
119116

120117
/*

tests/unit-math/test-math.inc.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,36 @@ check_double ("fmod (6.5, 2.3)", fmod (6.5, 2.3), 1.90000000000000035527E+00);
396396
check_double ("fmod (6.5, -2.3)", fmod (6.5, -2.3), 1.90000000000000035527E+00);
397397
check_double ("fmod (-6.5, 2.3)", fmod (-6.5, 2.3), -1.90000000000000035527E+00);
398398
check_double ("fmod (-6.5, -2.3)", fmod (-6.5, -2.3), -1.90000000000000035527E+00);
399+
check_int ("isfinite (0.0)", isfinite (0.0), 1);
400+
check_int ("isfinite (-0.0)", isfinite (-0.0), 1);
401+
check_int ("isfinite (1.0)", isfinite (1.0), 1);
402+
check_int ("isfinite (-1.0)", isfinite (-1.0), 1);
403+
check_int ("isfinite (INFINITY)", isfinite (INFINITY), 0);
404+
check_int ("isfinite (-INFINITY)", isfinite (-INFINITY), 0);
405+
check_int ("isfinite (NAN)", isfinite (NAN), 0);
406+
check_int ("isfinite (3.14)", isfinite (3.14), 1);
407+
check_int ("isfinite (-3.14)", isfinite (-3.14), 1);
408+
check_int ("isfinite (0.7)", isfinite (0.7), 1);
409+
check_int ("isfinite (-0.7)", isfinite (-0.7), 1);
410+
check_int ("isfinite (3.72e-09)", isfinite (3.72e-09), 1);
411+
check_int ("isfinite (-3.72e-09)", isfinite (-3.72e-09), 1);
412+
check_int ("isfinite (7.37e+19)", isfinite (7.37e+19), 1);
413+
check_int ("isfinite (-7.37e+19)", isfinite (-7.37e+19), 1);
414+
check_int ("isinf (0.0)", isinf (0.0), 0);
415+
check_int ("isinf (-0.0)", isinf (-0.0), 0);
416+
check_int ("isinf (1.0)", isinf (1.0), 0);
417+
check_int ("isinf (-1.0)", isinf (-1.0), 0);
418+
check_int ("isinf (INFINITY)", isinf (INFINITY), 1);
419+
check_int ("isinf (-INFINITY)", isinf (-INFINITY), -1);
420+
check_int ("isinf (NAN)", isinf (NAN), 0);
421+
check_int ("isinf (3.14)", isinf (3.14), 0);
422+
check_int ("isinf (-3.14)", isinf (-3.14), 0);
423+
check_int ("isinf (0.7)", isinf (0.7), 0);
424+
check_int ("isinf (-0.7)", isinf (-0.7), 0);
425+
check_int ("isinf (3.72e-09)", isinf (3.72e-09), 0);
426+
check_int ("isinf (-3.72e-09)", isinf (-3.72e-09), 0);
427+
check_int ("isinf (7.37e+19)", isinf (7.37e+19), 0);
428+
check_int ("isinf (-7.37e+19)", isinf (-7.37e+19), 0);
399429
check_int ("isnan (0.0)", isnan (0.0), 0);
400430
check_int ("isnan (-0.0)", isnan (-0.0), 0);
401431
check_int ("isnan (1.0)", isnan (1.0), 0);

tools/run-tests.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ def skip_if(condition, desc):
7272
skip=skip_if((sys.platform == 'win32'), 'FEATURE_INIT_FINI build flag isn\'t supported on Windows,' +
7373
' because Microsoft Visual C/C++ Compiler doesn\'t support' +
7474
' library constructors and destructors.')),
75+
Options('unittests-es5.1-debug-math',
76+
OPTIONS_COMMON + OPTIONS_UNITTESTS + OPTIONS_PROFILE_ES51 + OPTIONS_DEBUG
77+
+ ['--jerry-math=on']),
7578
]
7679

7780
# Test options for jerry-tests

tools/unit-tests/gen-test-math.c

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -442,25 +442,6 @@ main (int argc, char **args)
442442
GEN_DBL_TEST (fabs (7.37e+19));
443443
GEN_DBL_TEST (fabs (-7.37e+19));
444444

445-
/* finite tests */
446-
/* SKIPPED: not publicly declared in jerry-math
447-
GEN_INT_TEST (finite (0.0));
448-
GEN_INT_TEST (finite (-0.0));
449-
GEN_INT_TEST (finite (1.0));
450-
GEN_INT_TEST (finite (-1.0));
451-
GEN_INT_TEST (finite (INFINITY));
452-
GEN_INT_TEST (finite (-INFINITY));
453-
GEN_INT_TEST (finite (NAN));
454-
GEN_INT_TEST (finite (3.14));
455-
GEN_INT_TEST (finite (-3.14));
456-
GEN_INT_TEST (finite (0.7));
457-
GEN_INT_TEST (finite (-0.7));
458-
GEN_INT_TEST (finite (3.72e-09));
459-
GEN_INT_TEST (finite (-3.72e-09));
460-
GEN_INT_TEST (finite (7.37e+19));
461-
GEN_INT_TEST (finite (-7.37e+19));
462-
*/
463-
464445
/* floor tests */
465446
GEN_DBL_TEST (floor (0.0));
466447
GEN_DBL_TEST (floor (-0.0));
@@ -533,6 +514,40 @@ main (int argc, char **args)
533514
GEN_DBL_TEST (fmod (-6.5, 2.3));
534515
GEN_DBL_TEST (fmod (-6.5, -2.3));
535516

517+
/* isfinite tests */
518+
GEN_INT_TEST (isfinite (0.0));
519+
GEN_INT_TEST (isfinite (-0.0));
520+
GEN_INT_TEST (isfinite (1.0));
521+
GEN_INT_TEST (isfinite (-1.0));
522+
GEN_INT_TEST (isfinite (INFINITY));
523+
GEN_INT_TEST (isfinite (-INFINITY));
524+
GEN_INT_TEST (isfinite (NAN));
525+
GEN_INT_TEST (isfinite (3.14));
526+
GEN_INT_TEST (isfinite (-3.14));
527+
GEN_INT_TEST (isfinite (0.7));
528+
GEN_INT_TEST (isfinite (-0.7));
529+
GEN_INT_TEST (isfinite (3.72e-09));
530+
GEN_INT_TEST (isfinite (-3.72e-09));
531+
GEN_INT_TEST (isfinite (7.37e+19));
532+
GEN_INT_TEST (isfinite (-7.37e+19));
533+
534+
/* isinf tests */
535+
GEN_INT_TEST (isinf (0.0));
536+
GEN_INT_TEST (isinf (-0.0));
537+
GEN_INT_TEST (isinf (1.0));
538+
GEN_INT_TEST (isinf (-1.0));
539+
GEN_INT_TEST (isinf (INFINITY));
540+
GEN_INT_TEST (isinf (-INFINITY));
541+
GEN_INT_TEST (isinf (NAN));
542+
GEN_INT_TEST (isinf (3.14));
543+
GEN_INT_TEST (isinf (-3.14));
544+
GEN_INT_TEST (isinf (0.7));
545+
GEN_INT_TEST (isinf (-0.7));
546+
GEN_INT_TEST (isinf (3.72e-09));
547+
GEN_INT_TEST (isinf (-3.72e-09));
548+
GEN_INT_TEST (isinf (7.37e+19));
549+
GEN_INT_TEST (isinf (-7.37e+19));
550+
536551
/* isnan tests */
537552
GEN_INT_TEST (isnan (0.0));
538553
GEN_INT_TEST (isnan (-0.0));

0 commit comments

Comments
 (0)