bigfix.h
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:3k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // bigfix.h
  2. //
  3. // Copyright (C) 2007-2008, Chris Laurel <claurel@shatters.net>
  4. //
  5. // 128-bit fixed point (64.64) numbers for high-precision celestial
  6. // coordinates.  When you need millimeter accurate navigation across a scale
  7. // of thousands of light years, double precision floating point numbers
  8. // are inadequate.
  9. //
  10. // This program is free software; you can redistribute it and/or
  11. // modify it under the terms of the GNU General Public License
  12. // as published by the Free Software Foundation; either version 2
  13. // of the License, or (at your option) any later version.
  14. #ifndef _CELUTIL_BIGFIX64_H_
  15. #define _CELUTIL_BIGFIX64_H_
  16. #include <string>
  17. #include "basictypes.h"
  18. /*! 64.64 signed fixed point numbers.
  19.  */
  20. class BigFix
  21. {
  22.  public:
  23.     BigFix();
  24.     BigFix(uint64);
  25.     BigFix(double);
  26.     BigFix(const std::string&);
  27.     operator double() const;
  28.     operator float() const;
  29.     BigFix operator-() const;
  30.     BigFix operator+=(const BigFix&);
  31.     BigFix operator-=(const BigFix&);
  32.     friend BigFix operator+(const BigFix&, const BigFix&);
  33.     friend BigFix operator-(const BigFix&, const BigFix&);
  34.     friend BigFix operator*(const BigFix&, const BigFix&);
  35.     friend BigFix operator*(BigFix, double);
  36.     friend bool operator==(const BigFix&, const BigFix&);
  37.     friend bool operator!=(const BigFix&, const BigFix&);
  38.     friend bool operator<(const BigFix&, const BigFix&);
  39.     friend bool operator>(const BigFix&, const BigFix&);
  40.     int sign() const;
  41.     // for debugging
  42.     void dump();
  43.     std::string toString();
  44.  private:
  45.     bool isNegative() const
  46.     {
  47.         return hi > INT64_MAX;
  48.     }
  49.     static void negate128(uint64& hi, uint64& lo);
  50.  private:
  51.     uint64 hi;
  52.     uint64 lo;
  53. };
  54. // Compute the additive inverse of a 128-bit twos complement value
  55. // represented by two 64-bit values.
  56. inline void BigFix::negate128(uint64& hi, uint64& lo)
  57. {
  58.     // For a twos-complement number, -n = ~n + 1
  59.     hi = ~hi;
  60.     lo = ~lo;
  61.     lo++;
  62.     if (lo == 0)
  63.         hi++;
  64. }
  65. inline BigFix BigFix::operator-() const
  66. {
  67.     BigFix result = *this;
  68.     negate128(result.hi, result.lo);
  69.     return result;
  70. }
  71. inline BigFix BigFix::operator+=(const BigFix& a)
  72. {
  73.     lo += a.lo;
  74.     hi += a.hi;
  75.     // carry
  76.     if (lo < a.lo)
  77.         hi++;
  78.     return *this;
  79. }
  80. inline BigFix BigFix::operator-=(const BigFix& a)
  81. {
  82.     lo -= a.lo;
  83.     hi -= a.hi;
  84.     // borrow
  85.     if (lo > a.lo)
  86.         hi--;
  87.     return *this;
  88. }
  89. inline BigFix operator+(const BigFix& a, const BigFix& b)
  90. {
  91.     BigFix c;
  92.     c.lo = a.lo + b.lo;
  93.     c.hi = a.hi + b.hi;
  94.     // carry
  95.     if (c.lo < a.lo)
  96.         c.hi++;
  97.     return c;
  98. }
  99. inline BigFix operator-(const BigFix& a, const BigFix& b)
  100. {
  101.     BigFix c;
  102.     c.lo = a.lo - b.lo;
  103.     c.hi = a.hi - b.hi;
  104.     // borrow
  105.     if (c.lo > a.lo)
  106.         c.hi--;
  107.     return c;
  108. }
  109. #endif // _CELUTIL_BIGFIX64_H_