对于浮点宏,C标准对"转换为语义类型"意味着什么?

Tob*_*ght 5 c floating-point language-lawyer

我将引用N1570,但C11标准有类似的措辞:

fpclassify宏分类其参数值作为NaN时,无限的,正常的,低于正常的,零或为另一种实现定义的类别.首先,以比其语义类型更宽的格式表示的参数被转换为其语义类型.然后分类基于参数的类型.

(我的重点)

一个脚注:

由于可以使用比其类型更多的范围和精度来评估表​​达式,因此了解分类所基于的类型非常重要.例如,long double正常值在转换为时可能会变为低于正常值,转换double为零时可能会变为零float.

论证"转换为语义类型"意味着什么.任何明显的"语义类型"都没有定义.

我的理解是删除了任何多余的精度,就好像将表达式的值存储到变量of float,double或者long double,得到程序员期望的精度值.在这种情况下,fpclassify()在左值上使用和朋友将导致非优化编译器不需要转换.我是否正确,或者这些功能是否比宣传的功能少得多?

(这个问题来自对Code Review答案的评论)

Eri*_*hil 3

语义类型只是 C 标准中其他地方所描述的表达式的类型,忽略了允许以超额精度和范围表示值的事实。同样,语义类型是如果第 5.2.4.2.2 条第 9 段(规定浮点值可以使用超出范围和精度进行计算)不在标准中的表达式的类型。

\n\n

将参数转换为其语义类型意味着丢弃多余的精度和范围(通过使用对操作有效的任何舍入规则将值舍入到语义类型)。

\n\n

关于你的假设,应用fpclassify左值不需要任何转换(因为存储在由左值指定的对象中的值在分配时必须已经转换为其语义类型),我不确定这是否正式成立。当然,当通过赋值更新 object\xe2\x80\x99s 值时,5.2.4.2.2 9 要求删除多余的范围和精度。但请考虑修改值的其他方法,例如后缀增量运算符。这算作作业吗?6.5.2.4 2 中的规范表示,请参阅复合赋值的讨论以获取有关其转换和效果的信息。这有点模糊。人们必须考虑修改对象的所有可能方法并评估 C 标准对它们的规定。

\n