https://github.com/ITensor/ITensor
Tip revision: c76b5d9d91adb78fb4bdf6c6e8c76a01de6da04d authored by Miles Stoudenmire on 23 March 2016, 18:01:19 UTC
Merge branch 'master' of github.com:emstoudenmire/ITensor
Merge branch 'master' of github.com:emstoudenmire/ITensor
Tip revision: c76b5d9
real_test.cc
#include "test.h"
#include "global.h"
#include "real.h"
using namespace itensor;
TEST_CASE("Constructors")
{
LogNumber l1;
REQUIRE( std::isnan(l1.logNum()) );
CHECK_EQUAL(l1.sign(),1);
REQUIRE( std::isnan(l1.real()) );
LogNumber l2(1);
CHECK_CLOSE(l2.logNum(),0,LogNumber_Accuracy);
CHECK_EQUAL(l2.sign(),1);
CHECK_CLOSE(l2.real(),1,LogNumber_Accuracy);
LogNumber l3(-1);
CHECK_CLOSE(l3.logNum(),0,LogNumber_Accuracy);
CHECK_EQUAL(l3.sign(),-1);
CHECK_CLOSE(l3.real(),-1,LogNumber_Accuracy);
LogNumber l4(0);
CHECK_CLOSE(l4.logNum(),0,LogNumber_Accuracy);
CHECK_EQUAL(l4.sign(),0);
CHECK_CLOSE(l4.real(),0,LogNumber_Accuracy);
REQUIRE(l4.isRealZero());
const Real Big= 1E50;
const int BigExp = 50;
LogNumber l5(Big);
CHECK_CLOSE(l5.logNum(),BigExp*log(10),LogNumber_Accuracy);
CHECK_EQUAL(l5.sign(),1);
//CHECK_CLOSE(l5.real(),Big,LogNumber_Accuracy);
LogNumber l6(-Big);
CHECK_CLOSE(l6.logNum(),BigExp*log(10),LogNumber_Accuracy);
CHECK_EQUAL(l6.sign(),-1);
//CHECK_CLOSE(l6.real(),-Big,LogNumber_Accuracy);
Real r = Global::random();
LogNumber l7(r);
CHECK_CLOSE(l7.logNum(),log(fabs(r)),LogNumber_Accuracy);
CHECK_EQUAL(l7.sign(),(r > 0 ? 1 : -1));
//CHECK_CLOSE(l7.real(),r,LogNumber_Accuracy);
}
TEST_CASE("Operators")
{
Real a = Global::random(), b = Global::random();
const LogNumber la(a), lb(b);
CHECK_CLOSE((la*lb).real(),a*b,LogNumber_Accuracy);
CHECK_CLOSE((la/lb).real(),a/b,LogNumber_Accuracy);
CHECK_CLOSE((lb/la).real(),b/a,LogNumber_Accuracy);
LogNumber l1(a);
l1 *= -1;
CHECK_CLOSE((-l1).real(),a,LogNumber_Accuracy);
LogNumber l2(a);
l2 *= b;
CHECK_CLOSE(l2.real(),a*b,LogNumber_Accuracy);
LogNumber l3(a), l4(b);
l3 *= l4;
CHECK_CLOSE(l3.real(),a*b,LogNumber_Accuracy);
LogNumber l5(a),l6(b);
l5 *= -l6;
CHECK_CLOSE(l5.real(),-a*b,LogNumber_Accuracy);
LogNumber l7(a);
l7 /= b;
CHECK_CLOSE(l7.real(),a/b,LogNumber_Accuracy);
LogNumber l8(a),l9(b);
l8 /= l9;
CHECK_CLOSE(l8.real(),a/b,LogNumber_Accuracy);
}
TEST_CASE("Comparison")
{
Real a = Global::random(),
b = Global::random();
const LogNumber la(a),lb(b);
CHECK_EQUAL(la < lb,a < b);
CHECK_EQUAL(la > lb,a > b);
CHECK_EQUAL(la <= lb,a <= b);
CHECK_EQUAL(la >= lb,a >= b);
CHECK_EQUAL(la == lb,a == b);
const LogNumber dla(a+a*0.1*LogNumber_Accuracy);
REQUIRE(la.approxEquals(dla));
REQUIRE(la != dla);
const LogNumber mdla(a-a*0.1*LogNumber_Accuracy);
REQUIRE(la.approxEquals(mdla));
REQUIRE(la != mdla);
REQUIRE((la.magnitudeLessThan(lb) || lb.magnitudeLessThan(la)));
const LogNumber p(1E-10),q(1E-12),r(-1E-12);
REQUIRE(q.magnitudeLessThan(p));
REQUIRE(r.magnitudeLessThan(p));
REQUIRE(!p.magnitudeLessThan(p));
LogNumber zero(0);
REQUIRE(zero.approxEquals(zero));
zero *= -1;
REQUIRE(zero.approxEquals(zero));
LogNumber one(1);
REQUIRE(zero < one);
}