* Szabolcs Nagy [2013-07-30 04:26:21 +0200]: > * Rich Felker [2013-07-29 17:04:48 -0400]: > > On Mon, Jul 29, 2013 at 06:00:46PM +0200, Szabolcs Nagy wrote: > > > * Rich Felker [2013-07-29 02:34:56 -0400]: > > > > - i387 math asm does not truncate excess precision. Whether or not > > > > this omission is conforming in terms of the return value, it results > > > > in lost underflow exceptions, as demonstrated by nsz's math tests. > > > > > > the underflow problem is not i387 or excess precision related: > > > many (odd) math functions are almost the identity function > > > around x==0 (sin,asin,tan,atan,sinh,atanh,..) > > > > In the case of asin, etc it _is_ the excess precision. > > ah yes functions with x87 asm are different > > but the c code for asin has the issues i described > so it should fail to raise underflow on arm as well as discussed on irc.. iso c with annex f allows inexact to be omitted or raised spuriously, underflow may be raised spuriously but cannot be omitted, the other three flags must be raised correctly (except when explicitly specified otherwise) fdlibm was written so that all flags are respected, but there are many bugs so i think the reasonable behaviour is: - raise all flags correctly for correctly rounded functions (sqrt, fma, nextafter, fmax, rounding functions,..), otherwise - raise overflow, divbyzero, invalid flags correctly - don't care about inexact - raise underflow correctly when *possible * the requirement that underflow cannot be omitted is hard to fulfill when FLT_EVAL_METHOD!=0, for details see https://groups.google.com/forum/#!topic/comp.std.c/oosKDrY28E8 attached fenv flag fixes for some math functions (havent written commit messages yet and some other changes may be mixed into the diff) for i386 asm i check underflow first and only do the magic (store an underflowing float into memory) when it's not set (since the store is significantly slower than the flag check) however i'm not sure about the gain: if you have subnormal values around everything will be slow, avoiding an extra rounding probably does not buy much in the c version the fix can be ugly if FLT_EVAL_METHOD!=0 is supported (i use volatile hacks through FORCE_EVAL) fma, pow, atan2 are known to be broken (fma is fixed for i386 but not fmal and fmaf)