div: added long division, fixed a few bugs

This commit is contained in:
2017-08-03 16:22:17 -04:00
parent 6f93ebcb24
commit e86841ea6e
4 changed files with 82 additions and 15 deletions

View File

@@ -1,6 +1,13 @@
#include "greatest.h"
#include "../silly.h"
#define DELTA 0.01
#define ASSERT_DELTA(expected, actual) {\
double delta = expected-actual;\
ASSERT_IN_RANGE(0, delta, DELTA);\
}
TEST silly_zeros_is_zero() {
silly x = silly_zeros();
@@ -99,19 +106,35 @@ TEST silly_conversion() {
x.sign = 1;
x.before = 1;
x.after = (int)(((double)0xffffffff)/10);
ASSERT(-1.1 - silly_to_double(x) <= 0.01);
ASSERT_DELTA(-1.1, silly_to_double(x));
x = silly_from_float(0.0);
ASSERT_EQ_FMT(0.0, silly_to_double(x), "%f");
x = silly_from_float(-1.1);
ASSERT(-1.1 - silly_to_double(x) <= 0.01);
ASSERT_DELTA(-1.1, silly_to_double(x));
x = silly_from_double((double) 0.0);
ASSERT_EQ_FMT(0.0, silly_to_double(x), "%f");
x = silly_from_double((double) -1.1);
ASSERT(-1.1 - silly_to_double(x) <= 0.01);
ASSERT_DELTA(-1.1, silly_to_double(x));
x = silly_from_double((double) -413.25);
ASSERT(-413.25 - silly_to_double(x) <= 0.01);
ASSERT_DELTA(-413.25, silly_to_double(x));
PASS();
}
TEST silly_integral_division() {
silly x = make_silly(0, 10, 0);
silly y = make_silly(1, 5, 0);
ASSERT_EQ_FMT(-2.0, silly_to_double(silly_idiv(x, y)), "%f");
y = make_silly(1, 2, 5);
ASSERT_EQ_FMT(-4.0, silly_to_double(silly_idiv(x, y)), "%f");
y = make_silly(1, 2, 3);
ASSERT_EQ_FMT(-4.0, silly_to_double(silly_idiv(x, y)), "%f");
PASS();
}
@@ -122,14 +145,13 @@ TEST silly_division() {
ASSERT_EQ_FMT(-2.0, silly_to_double(silly_div(x, y)), "%f");
y = make_silly(1, 2, 5);
y = make_silly(1, 2, 0xffffffff/2);
ASSERT_EQ_FMT(-4.0, silly_to_double(silly_div(x, y)), "%f");
ASSERT_DELTA(-4.0, silly_to_double(silly_div(x, y)));
// :(
y = make_silly(1, 2, 3);
ASSERT_EQ_FMT(-4.0, silly_to_double(silly_div(x, y)), "%f");
x = make_silly(0, 4, 0);
y = make_silly(0, 8, 0);
ASSERT_DELTA(0.5, silly_to_double(silly_div(x, y)));
PASS();
}
@@ -140,6 +162,7 @@ SUITE(tests) {
RUN_TEST(silly_addition);
RUN_TEST(silly_subtraction);
RUN_TEST(silly_multiplication);
RUN_TEST(silly_integral_division);
RUN_TEST(silly_division);
RUN_TEST(silly_conversion);
}