aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/erl_bif_guard.c
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2017-02-14 15:53:04 +0100
committerSverker Eriksson <[email protected]>2017-02-14 16:02:03 +0100
commitd73423cdba178c166f25e00a4608ccc8d0465937 (patch)
tree78aa57f5dfe7ed6a388d0d28d0c6d9ab335a31f8 /erts/emulator/beam/erl_bif_guard.c
parent3b7a6ffddc819bf305353a593904cea9e932e7dc (diff)
downloadotp-d73423cdba178c166f25e00a4608ccc8d0465937.tar.gz
otp-d73423cdba178c166f25e00a4608ccc8d0465937.tar.bz2
otp-d73423cdba178c166f25e00a4608ccc8d0465937.zip
erts: Fix round/1 for large floats
1> round(6209607916799025.0). 6209607916799026 Problem: Adding/subtracting 0.5 and large double floats between (1 bsl 52) and (1 bsl 53) does not give reliable results. Solution: Use round() function in math.h.
Diffstat (limited to 'erts/emulator/beam/erl_bif_guard.c')
-rw-r--r--erts/emulator/beam/erl_bif_guard.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/erts/emulator/beam/erl_bif_guard.c b/erts/emulator/beam/erl_bif_guard.c
index b42d2dc28b..74cf7cf11a 100644
--- a/erts/emulator/beam/erl_bif_guard.c
+++ b/erts/emulator/beam/erl_bif_guard.c
@@ -157,7 +157,7 @@ BIF_RETTYPE round_1(BIF_ALIST_1)
GET_DOUBLE(BIF_ARG_1, f);
/* round it and return the resultant integer */
- res = double_to_integer(BIF_P, (f.fd > 0.0) ? f.fd + 0.5 : f.fd - 0.5);
+ res = double_to_integer(BIF_P, round(f.fd));
BIF_RET(res);
}
@@ -597,8 +597,7 @@ Eterm erts_gc_round_1(Process* p, Eterm* reg, Uint live)
}
GET_DOUBLE(arg, f);
- return gc_double_to_integer(p, (f.fd > 0.0) ? f.fd + 0.5 : f.fd - 0.5,
- reg, live);
+ return gc_double_to_integer(p, round(f.fd), reg, live);
}
Eterm erts_gc_trunc_1(Process* p, Eterm* reg, Uint live)