[ create a new paste ] login | about

Link: http://codepad.org/vHOHRS05    [ raw code | fork ]

C++, pasted on Oct 6:
#pragma comment(lib, "Kernel32.lib");

#include <cassert>
#include <new>
#include <iostream>
#include <cstdlib>
#include <windows.h>

class Matrix22
{
public:
  double m11, m12;
  double m21, m22;
public:
  inline Matrix22(void) {}
  inline Matrix22(Matrix22 const & m) :
    m11(m.m11), m12(m.m12),
    m21(m.m21), m22(m.m22) {}
  inline Matrix22(
    double const & n11, double const & n12,
    double const & n21, double const & n22
  ) :
    m11(n11), m12(n12),
    m21(n21), m22(n22) {}
  inline Matrix22 & operator = (Matrix22 const & m) {
    if(this != &m) {
    m11 = m.m11; m12 = m.m12;
    m21 = m.m21; m22 = m.m22; }
    return *this; }
public:
  inline void MultiplyAndAssignA(Matrix22 const & m);
  inline void MultiplyAndAssignB(Matrix22 const & m);
  inline void MultiplyAndAssignC(Matrix22 const & m); };

inline void Matrix22::MultiplyAndAssignA(Matrix22 const & m) {
  double tmp;
  tmp = m11 * m.m11 + m12 * m.m21;
  m12 = m11 * m.m12 + m12 * m.m22;
  m11 = tmp;
  tmp = m21 * m.m11 + m22 * m.m21;
  m22 = m21 * m.m12 + m22 * m.m22;
  m21 = tmp; }

inline void Matrix22::MultiplyAndAssignB(Matrix22 const & m) {
  *this = Matrix22(
    m11 * m.m11 + m12 * m.m21, m11 * m.m12 + m12 * m.m22,
    m21 * m.m11 + m22 * m.m21, m21 * m.m12 + m22 * m.m22); }

inline void Matrix22::MultiplyAndAssignC(Matrix22 const & m) {
  new (this) Matrix22(
    m11 * m.m11 + m12 * m.m21, m11 * m.m12 + m12 * m.m22,
    m21 * m.m11 + m22 * m.m21, m21 * m.m12 + m22 * m.m22); }

inline void Print(Matrix22 const & m) {
  std::cout << "[[" << m.m11 << " " << m.m12 << "][" << m.m21 << " " << m.m22 << "]]" << std::endl; }

class Time {
  LARGE_INTEGER origin;
public:
  inline Time(void) { QueryPerformanceCounter(&origin); }
  inline DWORD GetNow(void) const {
    LARGE_INTEGER now;
    QueryPerformanceCounter(&now);
  return now.LowPart - origin.LowPart; } };

inline double UnitRand(void) {
  double r(std::rand());
  return r / RAND_MAX; }

int main(void) {
  {
    DWORD t(0);
    std::srand(12358);
    Matrix22 m(1.0, 0.0, 0.0, 1.0);
    for(unsigned int i(0); i != 1000 * 1000; ++i) {
      Matrix22 n(UnitRand(), UnitRand(), UnitRand(), UnitRand());
      Time time;
      m.MultiplyAndAssignA(n);
      t += time.GetNow(); }
    std::cout << "VER A: " << t << std::endl; }
  {
    DWORD t(0);
    std::srand(12358);
    Matrix22 m(1.0, 0.0, 0.0, 1.0);
    for(unsigned int i(0); i != 1000 * 1000; ++i) {
      Matrix22 n(UnitRand(), UnitRand(), UnitRand(), UnitRand());
      Time time;
      m.MultiplyAndAssignB(n);
      t += time.GetNow(); }
    std::cout << "VER B: " << t << std::endl; }
  {
    DWORD t(0);
    std::srand(12358);
    Matrix22 m(1.0, 0.0, 0.0, 1.0);
    for(unsigned int i(0); i != 1000 * 1000; ++i) {
      Matrix22 n(UnitRand(), UnitRand(), UnitRand(), UnitRand());
      Time time;
      m.MultiplyAndAssignC(n);
      t += time.GetNow(); }
    std::cout << "VER C: " << t << std::endl; }
  return 0; }


Create a new paste based on this one


Comments: