在C中编写符合IEEE-754标准的双/浮点分区的最快方法是什么?

我想在C中编写符合IEEE-754标准的划分,特别是关于零处理的划分:正/ 0-> Inf,负/ 0-> -Inf,其他一切/ 0-> NaN.

虽然我机器上的简单C分区导致了这种行为,但C标准并没有强制要求这种语义.它是未定义的,所以我不能依赖它.

那么在C中实现这个的最快方法是什么?当然我可以这样做一个明确的测试:

double fdiv64(double numerator, double denominator)
{
   using limits=std::numeric_limits<double>;
   if (denominator==0.0) {
      if (numerator>0.0) {
         return limits::infinity();
      } else if (numerator<0.0) {
         return -limits::infinity();
      } else {
         return limits::quiet_NaN();
      }
   } else {
      return numerator/denominator;
   }
}

但是这会引入额外的分支,并且在我的机器上完全是多余的,因为无论如何我都能获得正确的行为.似乎没有符合IEEE-754标准的编译器内在函数.我可以使用内联汇编,但这也是非常不可移植的.

那么这种划分的最快方法是什么?

最佳答案
你不能这样做,我担心,除非你在软件中为不使用本机的平台构建你自己的IEEE754浮点实现,即便如此,由于你的类型不是一个微软的差异内置类型(例如&&和||如果你超载它们就不会被短路);虽然用户定义的文字可能会有所帮助.

例如,对于infinity的支持是可选的,并且只有在类型T的std :: numeric_limits< T> :: has_infinity == true时才会出现在平台上.

因此,尝试优化您声称的可移植代码甚至不在桌面上.

参考文献:

http://en.cppreference.com/w/cpp/types/numeric_limits/infinity
http://en.cppreference.com/w/cpp/language/user_literal

转载注明原文:在C中编写符合IEEE-754标准的双/浮点分区的最快方法是什么? - 代码日志