On Mon, Aug 17, 2020 at 10:31:08PM +0000, Joseph Myers wrote: > On Sat, 15 Aug 2020, Segher Boessenkool wrote: > > On Sat, Aug 15, 2020 at 12:10:42PM +0100, Roger Sayle wrote: > > > I'll quote Joseph Myers (many thanks) who describes things clearly as: > > > > (a) When both arguments are NaNs, the return value should be a qNaN, > > > > but sometimes it is an sNaN if at least one argument is an sNaN. > > > > Where is this defined? I can't find it in C11, in 18661, and of course > > it isn't what GCC does (it requires -fsignaling to even acknowledge the > > existence of signaling NaNs :-) ) > > The semantics of fmax and fmin are those of the maxNum and minNum > operations in IEEE 754-2008 (that were removed in IEEE 754-2019); see the > table of IEEE operation bindings that 18661-1 adds to Annex F. > > minNum(x, y) is the canonicalized number x if x < y, y if y < x, the > canonicalized number if one operand is a number and the other a quiet > NaN. Otherwise it is either x or y, canonicalized (this means results > might differ among implementations). When either x or y is a > signalingNaN, then the result is according to 6.2. > > maxNum(x, y) is the canonicalized number y if x < y, x if y < x, the > canonicalized number if one operand is a number and the other a quiet > NaN. Otherwise it is either x or y, canonicalized (this means results > might differ among implementations). When either x or y is a > signalingNaN, then the result is according to 6.2. > > where the relevant wording from 6.2 is > > Under default exception handling, any operation signaling an invalid > operation exception and for which a floating-point result is to be > delivered shall deliver a quiet NaN. > > Signaling NaNs shall be reserved operands that, under default exception > handling, signal the invalid operation exception (see 7.2) for every > general-computational and signaling-computational operation except for > the conversions described in 5.12. For non-default treatment, see 8. > > (and maxNum and minNum are in 5.3 "Homogeneous general-computational > operations").
Ah, so "When both arguments are NaNs, the return value should be a qNaN" means the QNaN corresponding to eother x or y. I see, thanks! Segher