如果一种语言希望在 x87 硬件和支持 binary128 类型的硬件上提供一致的浮点语义,现有的 binary128 实现是否能够使用要求所有中间结果舍入等效于 80 位类型的规则高效运行在 x87 上找到?尽管 x87 不能有效地使用需要以等效float
或double
精度评估结果的语言,因为这些类型具有不同的指数范围,因此具有非规范化值的不同行为,但似乎 binary128 和 binary80 都使用相同大小的指数字段,因此,四舍五入有效的底部 48 位应该在整个类型的计算范围内产生一致的结果。
语言设计假设未来的 PC 风格硬件将通过 x87 指令或通过可以模拟 80 位类型行为的 FPU 支持 80 位类型,即使值需要 128 位来存储,这是否合理? ?
例如,如果一种语言定义了类型:
- ieee32 == Binary32 ,除了 real32 或 realLiteral 之外,不能隐式转换为/从任何其他类型转换
- ieee64 == Binary64 ,除了 real64 或 realLiteral 之外,不能隐式转换为/从任何其他类型
- real32 == Binary32 急切地转换为 realComp 以进行所有计算,并且可以从所有实数类型隐式转换
- real64 == Binary64 急切地转换为 realComp 以进行所有计算,并且可以从所有实数类型隐式转换
- realComp == 中间结果类型,无论存储在其中的精度如何,都需要 128 位来存储
- realLiteral == 无后缀浮点字面量和常量表达式的类型;在内部作为最大精度值处理,但只能用作文字和常量表达式的类型;存储为最大精度,除非它会立即强制转换为较小的类型,在这种情况下,它将存储为目标类型。
语言是否可以提供承诺始终以 80 位精度处理的语义realComp
,或者这样的承诺可能会在某些平台上造成执行时间损失?将其简单地指定为 80 位或更好,并承诺任何有时具有 128 位精度的平台都会始终如一地这样做会更好吗?应该尝试在具有完全 64 位 FPU 的硬件上承诺什么(在没有 64 位 FPU 的典型 16 位或 32 位微控制器上,计算realComp
会比 on 更快double
)?