是否有任何硬件可以将超出范围的浮点转换为非零/最小/最大整数?

Is there any hardware which converts out of range floating-point to non-zero/min/max integer?

提问人:pmor 提问时间:8/28/2023 最后编辑:pmor 更新时间:9/11/2023 访问量:44

问:

在使用 Berkeley TestFloat 时,我注意到浮点到整数转换的测试是通过检查(特别是)特定的结果值来完成的:

// file: test_a_f32_z_i32_rx.c
// function: test_a_f32_z_i32_rx
        ...
        if ( (trueZ != subjZ) || (trueFlags != subjFlags) ) {
            if (
                   verCases_checkInvInts
                || (trueFlags != softfloat_flag_invalid)
                || (subjFlags != softfloat_flag_invalid)
                || ((subjZ != 0x7FFFFFFF) && (subjZ != -0x7FFFFFFF - 1)
                        && (! f32_isNaN( genCases_f32_a ) || (subjZ != 0)))
            ) {
                ++verCases_errorCount;

在这里,我们看到具体的结果值:、(最大有符号整数)、(最小有符号整数)。00x7FFFFFFF-0x7FFFFFFF - 1

但是,根据 C11(和更高)标准,将超出范围的浮点数转换为整数会导致 UB。由于通常会导致硬件指令的生成(例如 对于x86_64),我想知道:是否有任何硬件可以将超出范围的浮点转换为非零/最小/最大整数?(int)fcvttss2si


额外:为什么将“超出范围的整数转换为整数”会导致 IB,但将“超出范围的浮点数转换为整数”会导致 UB?

浮点 类型转换 硬件

评论

0赞 pmor 9/4/2023
回复:“不确定你在问什么”:是否有任何硬件返回最小/最大整数,也不返回?例如。0-6
0赞 pmor 9/5/2023
好的。 1) 回复:“非 IEEE 硬件陷阱”:IEEE 754 具有所谓的“替代异常处理”,据我所知,允许捕获:“注 2 — 异常的即时替代异常处理可以通过陷阱实现”。2)仅供参考:如果这样的陷阱会返回(例如),那么Berkeley TestFloat将报告误报。-6

答:

0赞 prabu naresh 8/28/2023 #1

从 C11 开始,C 标准将超出范围的浮点值转换为整数视为未定义行为 (UB)。这意味着编译器不受特定行为的约束,旨在防止跨平台问题。虽然某些硬件可能会单独处理此类转换,但这并不标准化或常见。Berkeley TestFloat 框架使用特定值进行测试,测试是否符合标准,但这些值可能无法反映所有硬件行为。优先考虑可移植性,遵循 C 标准的规则,避免对硬件行为的假设。显式处理超出范围的情况或使用库函数(如 isfinite)来确保在转换之前定义明确的行为。

1赞 2 revschux - Reinstate Monica #2

是否有任何硬件可以将超出范围的浮点转换为非零/最小/最大整数?

关于超出范围的内容的说明。

C 将浮点到整数的转换指定为截断浮点值的转换。

对于转换为 32 位整数,有效范围略大于 [-2,147,483,648.0 ...2,147,483,647.0]。 它是 (-2,147,483,649.0 ...2,147,483,648.0)。 请注意 versus .()[]


转换前测试的示例代码。它利用的优势始终是 - 2 的幂 (C23),这是一个梅森数floatINT_MININT_MAX

#define FLT_INT_MIN INT_MIN
#define FLT_INT_MAX_PLUS1 ((INT_MAX/2 + 1)*2.0f)

bool float_to_int_range_test(float f) {
  return isgreater(f - FLT_INT_MIN, -1) && 
      isless(f, FLT_INT_MAX_PLUS1);
}

评论

0赞 pmor 9/11/2023
一个很好的笔记,谢谢。回复:“略多于......”:没错。在我的 FP 测试(仍未完成)中,有像 和 这样的宏,它们指定了最大和最小 FP 值,C 标准明确定义了转换为整数的行为。F2I_FMAXF2I_FMIN
1赞 chux - Reinstate Monica 9/11/2023
@pmor 答案已更新。
0赞 pmor 9/11/2023
好的,考虑解决这个问题。
0赞 pmor 9/18/2023
考虑解决/评论这个答案。