aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/sys/win32/sys_float.c
diff options
context:
space:
mode:
authorMikael Pettersson <[email protected]>2016-04-17 20:02:28 +0200
committerLukas Larsson <[email protected]>2016-04-26 10:28:22 +0200
commit0127f930e6aa2abc95ec4a95c9d5638d7e9bd512 (patch)
tree3629899b02f9eb9a1855ffcaa9a886f4a6d97cdd /erts/emulator/sys/win32/sys_float.c
parent76cf34c49631845a21ffdd6d317d7fc944ab9b7b (diff)
downloadotp-0127f930e6aa2abc95ec4a95c9d5638d7e9bd512.tar.gz
otp-0127f930e6aa2abc95ec4a95c9d5638d7e9bd512.tar.bz2
otp-0127f930e6aa2abc95ec4a95c9d5638d7e9bd512.zip
matherr() must not fake an FP exception
When FP exceptions are used, matherr() forces a fake FP exception, which is interpreted as an error by the checking code after a math routine call. This is wrong for several reasons: - it's not necessary for error checking: when FP exceptions aren't used, matherr() is a stub and no information is derived from it being called - it's not necessary for FPU maintenance: the FPU only needs to be reprogrammed after an actual FP exception - it causes false negatives: matherr() may be called even though Erlang doesn't consider the case to be an error (exp() and pow() underflows on Solaris for instance); with FP exceptions enabled they are incorrectly considered errors The fix is to remove all FP exception related code from matherr().
Diffstat (limited to 'erts/emulator/sys/win32/sys_float.c')
-rw-r--r--erts/emulator/sys/win32/sys_float.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/erts/emulator/sys/win32/sys_float.c b/erts/emulator/sys/win32/sys_float.c
index a2b9bd1263..2b2d6ab7d3 100644
--- a/erts/emulator/sys/win32/sys_float.c
+++ b/erts/emulator/sys/win32/sys_float.c
@@ -139,8 +139,7 @@ sys_double_to_chars_ext(double fp, char *buffer, size_t buffer_size, size_t deci
int
matherr(struct _exception *exc)
{
- erl_fp_exception = 1;
- DEBUGF(("FP exception (matherr) (0x%x) (%d)\n", exc->type, erl_fp_exception));
+ DEBUGF(("FP exception (matherr) (0x%x)\n", exc->type));
return 1;
}