源值超范围时转十进制浮点类型:为何标准未明确未定义行为?
当转换为标准浮点类型时,若源值超出该标准浮点类型的可表示范围,则转换行为为未定义行为,对应N3220的两个条款:
6.3.1.4 实浮点类型与整数类型
[...]
3. 当整数类型的值转换为标准浮点类型时,若待转换值可在新类型中精确表示,则保持不变;若待转换值在可表示范围内但无法精确表示,结果为可表示的最近上限或下限值,具体由实现定义。若待转换值超出可表示范围,行为未定义。
6.3.1.5 实浮点类型之间的转换
[...]
2. 当实浮点类型的值转换为标准浮点类型时,若待转换值在可表示范围内但无法精确表示,结果为可表示的最近上限或下限值,具体由实现定义。若待转换值超出可表示范围,行为未定义。
我注意到,转换为十进制浮点类型的对应条款(N3220 §6.3.1.4(4) 及 §6.3.1.5(3))表述类似,但未提及源值超出十进制浮点类型可表示范围时的处理:
6.3.1.4 实浮点类型与整数类型
[...]
4. 当整数类型的值转换为十进制浮点类型时,若待转换值可在新类型中精确表示,则保持不变;若无法精确表示,结果应按IEC 60559规定正确舍入并触发异常。
6.3.1.5 实浮点类型之间的转换
[...]
3. 当实浮点类型的值转换为十进制浮点类型时,若待转换值无法精确表示,结果按IEC 60559规定正确舍入并触发异常。
虽可通过N3220 §4(2)推断此类转换仍为未定义行为,但为何标准未像标准浮点类型那样明确声明该情况?此外,由于三种十进制浮点类型(_Decimal32、_Decimal64 及 _Decimal128)必须符合对应的ISO/IEC 60559格式,我曾推测Annex F中会有相关规定,但目前尚未找到,特此咨询相关原因。
内容的提问来源于stack exchange,提问作者user51462

