【发布时间】:2013-01-19 20:46:59
【问题描述】:
当您使用浮点数(float、double、long double 类型)进行运算时,是否可以检测到精度损失?说:
template< typename F >
F const sum(F const & a, F const & b)
{
F const sum_(a + b);
// The loss of precision must be detected (here or one line above) if some fraction bit is lost due to rounding
return sum_;
}
当x87 FPU 出现在目标架构上但没有asm 例程干预纯C++ 代码的情况下尤其感兴趣。 C++11 或 gnu++11 特定功能也可以接受。
【问题讨论】:
-
我认为数字的 C++11 类型特征确实有类似的东西
-
也许
numeric_limits<T>类型特征的is_exact值就是你要找的东西 -
我认为这是不可能的,因为 x87 FPU 的状态字中的 P 位只有在二进制操作动作完成后才能检查已执行。
-
检查
sum-a==b和sum-b==a?或者尝试使用 fenv.h(许多编译器没有正确实现)。 -
特别是关于 x87,我相信您会在网络上(甚至在 SO)上找到很多很好的讨论。由于在不可预测的时间进行双重舍入,它使事情变得复杂。 gcc 有处理它的标志(其中一些只适用于 C)。大多数可移植性是将 sum 写入 volatile 变量并将其读回(强制舍入)。