floating point update...

This commit is contained in:
Kelvin Sherlock
2016-11-13 11:02:57 -05:00
parent 3c1a33323e
commit 9a98bb40b6
3 changed files with 482 additions and 367 deletions

View File

@@ -1,30 +1,51 @@
#define CATCH_CONFIG_MAIN
#include "catch.hpp"
#include "../toolbox/floating_point.h"
#include "floating_point.h"
#include <cmath>
#include <cstring>
namespace fp = floating_point;
void bitdump(const void *vp, unsigned bytes) {
const uint8_t *p = (const uint8_t *)vp;
p += bytes;
for (unsigned i = 0; i < bytes; ++i) {
uint8_t c = *(--p);
for (int j = 0x80; j; j >>= 1) {
printf ("%d", c & j ? 1 : 0);
}
printf(" ");
}
printf("\n");
}
TEST_CASE( "1.0 is handled", "[floating point info]") {
fpinfo fpi;
fp::info fpi;
fpi = fpinfo((float)1.0);
fpi = fp::info((float)1.0);
REQUIRE(fpi.nan == false);
REQUIRE(fpi.inf == false);
REQUIRE(fpi.sign == 0);
REQUIRE(fpi.exp == 0);
REQUIRE(fpi.sig == 0x8000000000000000);
fpi = fpinfo((double)1.0);
fpi = fp::info((double)1.0);
REQUIRE(fpi.nan == false);
REQUIRE(fpi.inf == false);
REQUIRE(fpi.sign == 0);
REQUIRE(fpi.exp == 0);
REQUIRE(fpi.sig == 0x8000000000000000);
fpi = fpinfo((long double)1.0);
fpi = fp::info((long double)1.0);
REQUIRE(fpi.nan == false);
REQUIRE(fpi.inf == false);
REQUIRE(fpi.sign == 0);
@@ -35,23 +56,23 @@ TEST_CASE( "1.0 is handled", "[floating point info]") {
TEST_CASE( "-1.0 is handled", "[floating point info]") {
fpinfo fpi;
fp::info fpi;
fpi = fpinfo((float)-1.0);
fpi = fp::info((float)-1.0);
REQUIRE(fpi.nan == false);
REQUIRE(fpi.inf == false);
REQUIRE(fpi.sign == 1);
REQUIRE(fpi.exp == 0);
REQUIRE(fpi.sig == 0x8000000000000000);
fpi = fpinfo((double)-1.0);
fpi = fp::info((double)-1.0);
REQUIRE(fpi.nan == false);
REQUIRE(fpi.inf == false);
REQUIRE(fpi.sign == 1);
REQUIRE(fpi.exp == 0);
REQUIRE(fpi.sig == 0x8000000000000000);
fpi = fpinfo((long double)-1.0);
fpi = fp::info((long double)-1.0);
REQUIRE(fpi.nan == false);
REQUIRE(fpi.inf == false);
REQUIRE(fpi.sign == 1);
@@ -62,23 +83,23 @@ TEST_CASE( "-1.0 is handled", "[floating point info]") {
TEST_CASE( "2.0 is handled", "[floating point info]") {
fpinfo fpi;
fp::info fpi;
fpi = fpinfo((float)2.0);
fpi = fp::info((float)2.0);
REQUIRE(fpi.nan == false);
REQUIRE(fpi.inf == false);
REQUIRE(fpi.sign == 0);
REQUIRE(fpi.exp == 1);
REQUIRE(fpi.sig == 0x8000000000000000);
fpi = fpinfo((double)2.0);
fpi = fp::info((double)2.0);
REQUIRE(fpi.nan == false);
REQUIRE(fpi.inf == false);
REQUIRE(fpi.sign == 0);
REQUIRE(fpi.exp == 1);
REQUIRE(fpi.sig == 0x8000000000000000);
fpi = fpinfo((long double)2.0);
fpi = fp::info((long double)2.0);
REQUIRE(fpi.nan == false);
REQUIRE(fpi.inf == false);
REQUIRE(fpi.sign == 0);
@@ -89,23 +110,23 @@ TEST_CASE( "2.0 is handled", "[floating point info]") {
TEST_CASE( "NaN("") is handled", "[floating point info]") {
fpinfo fpi;
fp::info fpi;
fpi = fpinfo(nanf(""));
fpi = fp::info(nanf(""));
REQUIRE(fpi.nan == true);
REQUIRE(fpi.inf == false);
REQUIRE(fpi.sign == 0);
REQUIRE(fpi.exp == 0);
REQUIRE(fpi.sig == 0x0000000000000000);
fpi = fpinfo(nan(""));
fpi = fp::info(nan(""));
REQUIRE(fpi.nan == true);
REQUIRE(fpi.inf == false);
REQUIRE(fpi.sign == 0);
REQUIRE(fpi.exp == 0);
REQUIRE(fpi.sig == 0x0000000000000000);
fpi = fpinfo(nanl(""));
fpi = fp::info(nanl(""));
REQUIRE(fpi.nan == true);
REQUIRE(fpi.inf == false);
REQUIRE(fpi.sign == 0);
@@ -116,23 +137,23 @@ TEST_CASE( "NaN("") is handled", "[floating point info]") {
TEST_CASE( "NaN(255) is handled", "[floating point info]") {
fpinfo fpi;
fp::info fpi;
fpi = fpinfo(nanf("255"));
fpi = fp::info(nanf("255"));
REQUIRE(fpi.nan == true);
REQUIRE(fpi.inf == false);
REQUIRE(fpi.sign == 0);
REQUIRE(fpi.exp == 0);
REQUIRE(fpi.sig == 255);
fpi = fpinfo(nan("255"));
fpi = fp::info(nan("255"));
REQUIRE(fpi.nan == true);
REQUIRE(fpi.inf == false);
REQUIRE(fpi.sign == 0);
REQUIRE(fpi.exp == 0);
REQUIRE(fpi.sig == 255);
fpi = fpinfo(nanl("255"));
fpi = fp::info(nanl("255"));
REQUIRE(fpi.nan == true);
REQUIRE(fpi.inf == false);
REQUIRE(fpi.sign == 0);
@@ -143,23 +164,23 @@ TEST_CASE( "NaN(255) is handled", "[floating point info]") {
TEST_CASE( "Inf is handled", "[floating point info]") {
fpinfo fpi;
fp::info fpi;
fpi = fpinfo((float)1.0/0.0);
fpi = fp::info((float)1.0/0.0);
REQUIRE(fpi.nan == false);
REQUIRE(fpi.inf == true);
REQUIRE(fpi.sign == 0);
REQUIRE(fpi.exp == 0);
REQUIRE(fpi.sig == 0);
fpi = fpinfo((double)1.0/0.0);
fpi = fp::info((double)1.0/0.0);
REQUIRE(fpi.nan == false);
REQUIRE(fpi.inf == true);
REQUIRE(fpi.sign == 0);
REQUIRE(fpi.exp == 0);
REQUIRE(fpi.sig == 0);
fpi = fpinfo((long double)1.0/0.0);
fpi = fp::info((long double)1.0/0.0);
REQUIRE(fpi.nan == false);
REQUIRE(fpi.inf == true);
REQUIRE(fpi.sign == 0);
@@ -173,17 +194,20 @@ TEST_CASE( "Re-cast 0.0", "[floating point info]") {
float target_f = 0.0;
double target_d = 0.0;
double target_ld = 0.0;
long double ld;
double d;
float f;
fpinfo fpi(0.0l);
fp::info fpi(0.0l);
fpi.write(f);
fpi.write(d);
fpi.write(ld);
REQUIRE(memcmp(&target_f, &f, sizeof(f)) == 0);
REQUIRE(memcmp(&target_d, &d, sizeof(d)) == 0);
REQUIRE(memcmp(&target_ld, &ld, sizeof(ld)) == 0);
}
@@ -192,17 +216,20 @@ TEST_CASE( "Re-cast 1.0", "[floating point info]") {
float target_f = 1.0;
double target_d = 1.0;
double target_ld = 1.0;
long double ld;
double d;
float f;
fpinfo fpi(1.0l);
fp::info fpi(1.0l);
fpi.write(f);
fpi.write(d);
fpi.write(ld);
REQUIRE(memcmp(&target_f, &f, sizeof(f)) == 0);
REQUIRE(memcmp(&target_d, &d, sizeof(d)) == 0);
REQUIRE(memcmp(&target_ld, &ld, sizeof(ld)) == 0);
}
@@ -211,17 +238,20 @@ TEST_CASE( "Re-cast -1.0", "[floating point info]") {
float target_f = -1.0;
double target_d = -1.0;
double target_ld = -1.0;
long double ld;
double d;
float f;
fpinfo fpi(-1.0l);
fp::info fpi(-1.0l);
fpi.write(f);
fpi.write(d);
fpi.write(ld);
REQUIRE(memcmp(&target_f, &f, sizeof(f)) == 0);
REQUIRE(memcmp(&target_d, &d, sizeof(d)) == 0);
REQUIRE(memcmp(&target_ld, &ld, sizeof(ld)) == 0);
}
@@ -231,17 +261,20 @@ TEST_CASE( "Re-cast 1000.0", "[floating point info]") {
float target_f = 1000.0;
double target_d = 1000.0;
double target_ld = 1000.0;
long double ld;
double d;
float f;
fpinfo fpi(1000.0l);
fp::info fpi(1000.0l);
fpi.write(f);
fpi.write(d);
fpi.write(ld);
REQUIRE(memcmp(&target_f, &f, sizeof(f)) == 0);
REQUIRE(memcmp(&target_d, &d, sizeof(d)) == 0);
REQUIRE(memcmp(&target_ld, &ld, sizeof(ld)) == 0);
}
@@ -251,17 +284,20 @@ TEST_CASE( "Re-cast Inf", "[floating point info]") {
float target_f = 1.0/0.0;
double target_d = 1.0/0.0;
double target_ld = 1.0/0.0;
long double ld;
double d;
float f;
fpinfo fpi(1.0/0.0l);
fp::info fpi(1.0/0.0l);
fpi.write(f);
fpi.write(d);
fpi.write(ld);
REQUIRE(memcmp(&target_f, &f, sizeof(f)) == 0);
REQUIRE(memcmp(&target_d, &d, sizeof(d)) == 0);
REQUIRE(memcmp(&target_ld, &ld, sizeof(ld)) == 0);
}
@@ -270,15 +306,18 @@ TEST_CASE( "Re-cast NaN", "[floating point info]") {
float target_f = nanf("16");
double target_d = nan("16");
double target_ld = nanl("16");
long double ld;
double d;
float f;
fpinfo fpi(nanl("16"));
fp::info fpi(nanl("16"));
fpi.write(f);
fpi.write(d);
fpi.write(ld);
REQUIRE(memcmp(&target_f, &f, sizeof(f)) == 0);
REQUIRE(memcmp(&target_d, &d, sizeof(d)) == 0);
REQUIRE(memcmp(&target_ld, &ld, sizeof(ld)) == 0);
}