diff options
author | Szabolcs Nagy <nsz@port70.net> | 2013-05-19 14:43:32 +0000 |
---|---|---|
committer | Szabolcs Nagy <nsz@port70.net> | 2013-05-19 14:43:32 +0000 |
commit | 1e5eb73545ca6cfe8b918798835aaf6e07af5beb (patch) | |
tree | d1af43fb6a86387586e5fbdcede7d2a3f56c78d4 /src/math/fmaf.c | |
parent | ffd8ac2dd50f99c3c83d7d9d845df9874ec3e7d5 (diff) | |
download | musl-1e5eb73545ca6cfe8b918798835aaf6e07af5beb.tar.gz musl-1e5eb73545ca6cfe8b918798835aaf6e07af5beb.tar.xz musl-1e5eb73545ca6cfe8b918798835aaf6e07af5beb.zip |
math: add fma TODO comments about the underflow issue
The underflow exception is not raised correctly in some cornercases (see previous fma commit), added comments with examples for fmaf, fmal and non-x86 fma. In fmaf store the result before returning so it has the correct precision when FLT_EVAL_METHOD!=0
Diffstat (limited to 'src/math/fmaf.c')
-rw-r--r-- | src/math/fmaf.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/math/fmaf.c b/src/math/fmaf.c index a1c7f4f8..745ee393 100644 --- a/src/math/fmaf.c +++ b/src/math/fmaf.c @@ -49,7 +49,14 @@ float fmaf(float x, float y, float z) (hr & 0x7ff00000) == 0x7ff00000 || /* NaN */ result - xy == z || /* exact */ fegetround() != FE_TONEAREST) /* not round-to-nearest */ - return (result); + { + /* + TODO: underflow is not raised correctly, example in + downward rouding: fmaf(0x1p-120f, 0x1p-120f, 0x1p-149f) + */ + z = result; + return z; + } /* * If result is inexact, and exactly halfway between two float values, @@ -63,5 +70,6 @@ float fmaf(float x, float y, float z) fesetround(FE_TONEAREST); if (result == adjusted_result) SET_LOW_WORD(adjusted_result, lr + 1); - return (adjusted_result); + z = adjusted_result; + return z; } |