FLT_HAS_subnormal为0:使用手动构造的次正常值执行fpclassify()是否会导致UB或导致WDB返回FP_subnormal?

FLT_HAS_subnormal为0:使用手动构造的次正常值执行fpclassify()是否会导致UB或导致WDB返回FP_subnormal?,c,floating-point,language-lawyer,undefined-behavior,math.h,C,Floating Point,Language Lawyer,Undefined Behavior,Math.h,在FLT_HAS_SUBNORM==0(或任何XXX_HAS_SUBNORM==0的情况下,fpclassify宏与手动构造的subnormal(通过union使用类型punning构造,使用memcpy,从文件读取等)的执行是否会导致未定义的行为(UB)或者导致定义良好的行为(WDB)返回FP\u低于正常值(如预期) 注: C标准在FLT\u子规范为0的情况下有很大的限制。关于FLT\u HAS\u SUBNORM为0的所有说明如下: 如果没有浮点操作从非次正常输入中产生次正常结果,即使类型格

FLT_HAS_SUBNORM==0
(或任何
XXX_HAS_SUBNORM==0
的情况下,
fpclassify
宏与手动构造的subnormal(通过
union
使用类型punning构造,使用
memcpy
,从文件读取等)的执行是否会导致未定义的行为(UB)或者导致定义良好的行为(WDB)返回
FP\u低于正常值
(如预期)

注:

  • C标准在
    FLT\u子规范为0的情况下有很大的限制。关于
    FLT\u HAS\u SUBNORM为0的所有说明如下:
  • 如果没有浮点操作从非次正常输入中产生次正常结果,即使类型格式包含次正常数字的表示,也可以将其指定为不存在

    这可以解释为:

    如果FLT_HAS_SUBNORM为0,则任何_normal任何_normal都不会生成次正规

  • C标准似乎忽略了以下情况下行为的明确定义(表述为问题):
  • 如果
    FLT_HAS_SUBNORM为0
    :使用手动构造的子规范(通过
    union
    使用类型punning构造、使用
    memcpy
    、从文件读取等)表示的输入执行任何FP操作是否会导致未定义的行为(UB)

  • 如果省略了行为的明确定义,则根据C标准:
  • …未定义的行为在本文件中另有说明…通过省略任何明确的行为定义


    注:
    FLT\u有子规范
    有3个定义值:-1、0、1。问题的焦点是它是否为零。给定
    FLT\u HAS\u SUBNORM==0
    ,该问题是否适用于包含次正常数字表示的实现子集,并且手动构造的实现是有效的?您可以向ISO C标准委员会提交缺陷报告,指出不清晰之处并提出修复建议,或者联系Tydeman Consulting的Fred Tydeman,谁似乎拥有这些宏。最好将次正常支持视为两个属性的集合:次正常输入是否视为零(DAZ=“非正常值为零”);算术运算是否会产生低于正常值的结果,或者这些结果是否刷新为零(FTZ=“刷新为零”)。在许多编程环境中,DAZ=true意味着FTZ=true,反之亦然似乎表明他们考虑到了这种情况,并表示即使FLT_的_SUBNORM==0,低于正常的输入也会产生低于正常的输出。实现的浮点格式以与IEEE-754一致的方式表示零和标准化的浮点值,这一事实并不迫使它以相同的方式处理其他位模式时尚与IEEE-754一致。如果一个实现没有为浮点位模式指定任何特定的含义,它可以自由地将其视为陷阱表示,并以任意方式处理它。