代码之家  ›  专栏  ›  技术社区  ›  Toby Speight

对于浮点宏,“转换为语义类型”是什么意思?

  •  5
  • Toby Speight  · 技术社区  · 7 年前

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

    这个 fpclassify 宏将其参数值分类为NaN、Infinite、Normal, 次正常、零或进入另一个实现定义的类别。首先,一个论点 以比其语义类型更宽的格式表示 转换为其语义类型 . 然后根据参数的类型进行分类。

    (我的重点)

    以及脚注:

    由于表达式的计算范围和精度高于其类型,因此必须 了解分类所依据的类型。例如,正常 long double 价值可能 当转换为 double ,当转换为时为零 float .

    参数“转换为语义类型”是什么意思?在任何明显的地方都没有“语义类型”的定义。

    我的理解是,删除任何多余的精度,就好像将表达式的值存储到 浮动 , 双重的 长双精度 从而得到程序员期望的精度值。在这种情况下,使用 fpclassify() 而左值上的朋友将不会导致非优化编译器所需的转换。我是正确的吗,还是这些功能比广告宣传的要有用得多?

    (这个问题来自于 Code Review answer )

    1 回复  |  直到 7 年前
        1
  •  3
  •   Eric Postpischil    7 年前

    语义类型只是C标准中其他地方描述的表达式的类型,而不考虑允许用过多的精度和范围来表示值这一事实。同样,如果第5.2.4.2.2条第9款(该款规定浮点值可以用超出的范围和精度进行计算)不在标准中,则语义类型是表达式的类型。

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

    关于你的假设 fpclassify 到左值不需要任何转换(因为存储在由左值指定的对象中的值在分配时必须已转换为其语义类型),我不确定它是否正式有效。当然,当通过赋值更新对象值时,5.2.4.2.2 9要求删除超出的范围和精度。但请考虑修改值的其他方法,例如后缀增量运算符。这算作业吗?它在6.5.2.4 2中的规格说明说,要了解它的转换和效果的信息,请参阅化合物分配的讨论。那有点含糊。我们必须考虑修改对象的所有可能方法,并评估C标准对它们的描述。