1

我继续将 GeographicLib 移植到 F# 中,我想知道如何使用无错误总和。在 C++ 代码库中,它被定义为

/**
 * The error-free sum of two numbers.
 *
 * @tparam T the type of the argument and the returned value.
 * @param[in] u
 * @param[in] v
 * @param[out] t the exact error given by (\e u + \e v) - \e s.
 * @return \e s = round(\e u + \e v).
 *
 * See D. E. Knuth, TAOCP, Vol 2, 4.2.2, Theorem B.  (Note that \e t can be
 * the same as one of the first two arguments.)
 **********************************************************************/
template<typename T> static inline T sum(T u, T v, T& t) {
  GEOGRAPHICLIB_VOLATILE T s = u + v;
  GEOGRAPHICLIB_VOLATILE T up = s - v;
  GEOGRAPHICLIB_VOLATILE T vpp = s - up;
  up -= u;
  vpp -= v;
  t = -(up + vpp);
  // u + v =       s      + t
  //       = round(u + v) + t
  return s;
}

作为参考,GEOGRAPHICLIB_VOLATILE 常量使您能够使用volatile或不使用关键字,具体取决于您的架构和精度。

我必须承认,我没有读过 Knuth 的书,也没有手头的副本,所以我看不懂定理 B,但是描述很清楚:该函数旨在返回总和和和的浮点误差。

我的问题是:在直接实现之前,我应该了解 .NET Framework 中的任何优化吗?F# 是否以与 C++ 相同的方式处理浮点数?

4

0 回答 0