view Math.h @ 1440:a72236d60edc

m
author Ritor1
date Sat, 27 Jul 2013 09:36:29 +0600
parents 0aeac0b9ca30
children f0551cd4cbc9
line wrap: on
line source

#pragma once
#include <cassert>
#include <limits>
#include <float.h>
#include <cmath>
#include <cstdlib>
#include <ciso646>


/*  186 */
#pragma pack(push, 1)
struct stru193_math
{
  stru193_math();
  int Cos(int angle);
  unsigned int Atan2(int x, int y);
  int Sin(int angle);

  int pTanTable[520];
  int pCosTable[520];
  int pInvCosTable[520];
  static const unsigned int uIntegerPi = 1024;
  static const unsigned int uIntegerHalfPi = 512;
  static const unsigned int uIntegerDoublePi = 2048;
  static const unsigned int uDoublePiMask = 2047;
  static const unsigned int uPiMask = 1023;
  static const unsigned int uHalfPiMask = 511;
};
#pragma pack(pop)


int fixpoint_sub0(int, int);
int fixpoint_div(int, int);
int fixpoint_mul(int, int);
int fixpoint_from_float(float value);

#ifndef ROUNDING_EPSILON
#define ROUNDING_EPSILON 0.0000001
#endif


template <typename FloatType>
int bankersRounding(
  const FloatType& value
  ) {
    assert("Method unsupported for this type" && false);
    return value;
}

template<> static int bankersRounding<float>(const float& inValue)
{
  union Cast
  {
    double d;
    long l;
  };
  volatile Cast c;
  c.d = inValue + 6755399441055744.0;
  return c.l;
}

#pragma push_macro("max")
#undef max

template<> static int bankersRounding<double>(const double& inValue)
{
  double maxValue = std::numeric_limits<int>::max();
  assert(maxValue - 6755399441055744.0 >= inValue);
  union Cast
  {
    double d;
    long l;
  };
  volatile Cast c;
  c.d = inValue + 6755399441055744.0;
  return c.l;
}


#pragma pop_macro("max")

extern struct stru193_math *stru_5C6E00;