【发布时间】:2018-03-12 23:33:27
【问题描述】:
C 2011 [N1570] 5.2.4.2.2 9 说:
除了赋值和强制转换...,由具有浮动操作数的运算符产生的值和经过通常算术转换的值和浮动常量的值被评估为范围和精度可能大于类型要求的格式。
这是否意味着实现中的所有浮点运算都可以用一种格式进行评估,或者每个操作可以用一种格式进行评估具有更大的范围和精度?
如果A*B 以额外精度评估与A*B 以名义精度评估不同,后者将允许A*B == A*B 评估为假。
【问题讨论】:
-
@old_timer:IEEE 754 浮点乘法是可交换的。
-
@old_timer 您误解了 OP 的问题。 OP 正在询问 2 AB 是否可以不同。
-
@old_timer:IEEE 754 浮点乘法是可交换的。请不要分散注意力;它只是关于 C 语言对评估格式的要求,而不是关于浮点运算的属性。
-
@old_timer:显然,如果以不同的精度进行评估,表达式可能具有不同的值。那不是问题。问题是 C 标准是否允许使用不同的精度。
-
@liliscent:很容易构思一个可能混合精度的实现。考虑一个使用 x87 FPU 进行计算的编译器,它具有扩展的精度。 x87 FPU 在它的栈上只有 8 个空间,所以计算很容易溢出它。这将强制编译器将中间值存储到内存中,并且它可能会使用
double而不是完整的 x87 FPU 表达式来做到这一点。 (通常,在这种情况下,我会选择将整个 x87 FPU 值存储到内存中,但在设计编译器时可能需要考虑一些复杂的因素。)
标签: c floating-point language-lawyer