[Cfp-interest 1522] Re: request for input

Joseph Myers joseph at codesourcery.com
Mon Mar 2 13:17:15 PST 2020


On Mon, 2 Mar 2020, Jim Thomas wrote:

> In trying to redo the annex for TS-3 to not require support for any 
> particular interchange and extended types, I feel more strongly that 
> this would be the more useful approach. I believe some implementations 
> need nomenclature and rules for at least one extra floating type (for 
> _Float16, _Float80, or _Float128 in particular), but would balk at 
> having to also support _Float32, _Float64, and _Float32x, especially 
> when they already support equivalent types as float and double.

There's no such thing as _Float80 (that's not a width corresponding to an 
IEEE interchange encoding).

If you already support an equivalent type, supporting the extra name, and 
corresponding function aliases, is easy (whether the type is a distinct 
type, which is what you want to simplify use of _Generic without needing 
conditions in the user code for whether the types are distinct or not, or 
just acts as a typedef name rather than a distinct type).

(If the type is a distinct type, it's very clear that e.g. the functions 
for _Float64 can have the same addresses as the functions for double, 
because little is specified about the results of converting function 
pointers from one type to another.  If it's a typedef, it's a bit less 
clear, see what I wrote in reflector message 14590 (25 Jan 2017), though 
normal library practice does often have e.g. ldexp = scalbn.)

> One of Jens's ideas was to replace new math functions with type-generic 
> macros. Though this is problematic for math functions in general (see 
> Joseph’s (SC22WG14.17170) N2426), these operations (that round result to 
> specified type) are somewhat special. IEC 60559 describes them as 
> generic operations, e.g., compare the IEC 60559 description of these 
> operations:

I think the same principle still applies to them - if e.g. libffi gets 
support for these types, then if you have normal functions any language 
runtime can bind to the functions, just like other C functions, without 
needing special C code, but if you only have type-generic macros then 
other-language bindings are more complicated.

> Implementations shall provide the following formatOf 
> general-computational operations, for destinations of all supported 
> arithmetic formats, and, for each destination format, for operands of 
> all supported arithmetic formats with the same radix as the destination 
> format.
> 
> ― formatOf-addition(source1, source2)
> 
> vs it’s description of other operations such as
> 
> Implementations shall provide the following homogeneous general-computational operations for all supported arithmetic formats: 
> 
> ― sourceFormat roundToIntegralTiesToEven(source)

The difference here is that formatOf-addition is one operation per format 
(with the format name as part of the operation name), generic over the 
other two formats, while roundToIntegralTiesToEven has a name independent 
of format and is generic over one format.  I.e. most operations are 
generic over at least one format in IEEE 754, and language bindings 
represent that in the most appropriate way for the language in question.  
I don't think the difference between a format name forming or not forming 
part of the name of the operation is relevant to type-specific versus 
type-generic bindings in C.

> Also, these operations (that round to narrower type) are correctly 
> rounded. So, for example, any faddsuffix function invocation would 
> produce the same result provided it’s arguments weren’t narrowed (with 
> loss of range and/or precision) to a parameter type, and It seems 

The tricky thing - the reason why the tgmath.h rules need to specify 
exactly how the underlying function is determined rather than just saying 
any function with wide-enough parameters is used - is integer types, which 
may get narrowed even when floating arguments don't (e.g. an 
implementation where binary64 is the widest floating-point format can't 
avoid narrowing long long arguments to these functions).

> What do you think?

Functions with defined parameter types are well-understood and work well 
in C and we know the TS specification for the functions can be implemented 
without problems.

Type-generic macros have proven much trickier in practice and many more 
issues have shown up in the past with attempts to specify particular 
type-generic macros in the standard C library.  I think we ended up with a 
reasonable specification for the tgmath.h macros after DR#13, but 
inventing type-generic macros is a high-risk area and I'd be wary of 
adding anything new there to the standard that doesn't come with 
implementation experience from the TS.

-- 
Joseph S. Myers
joseph at codesourcery.com


More information about the Cfp-interest mailing list