Browse Source

refactoring: rename addition functions for float sum

master
Dennis Sperzel 11 months ago
parent
commit
cd70bc3d28
  1. 26
      src/addition.c
  2. 12
      src/addition.h
  3. 76
      test/test_addition.c

26
src/addition.c

@ -24,7 +24,7 @@ void full_adder (num* sum, num* nextcarry, num number1, num number2, num carry)
// addition is an implementation of an 32 bit addition // addition is an implementation of an 32 bit addition
unsigned int addition(num number1, num number2) {
unsigned int addition_uint(num number1, num number2) {
unsigned int result = 0; unsigned int result = 0;
num sum[1] = {0}; num sum[1] = {0};
num nextcarry[1] = {0}; num nextcarry[1] = {0};
@ -43,33 +43,33 @@ unsigned int addition(num number1, num number2) {
// reading sign out of an integer (floating number) // reading sign out of an integer (floating number)
unsigned int sign(unsigned int number) {
unsigned int sign_float(unsigned int number) {
return number >> 31; return number >> 31;
} }
// reading precision out of an integer (floating number) // reading precision out of an integer (floating number)
unsigned int precision(unsigned int number) {
unsigned int precision_float(unsigned int number) {
unsigned int precision = 8388607; unsigned int precision = 8388607;
return (number & precision); return (number & precision);
} }
// reading exponent out of an integer (floating number) // reading exponent out of an integer (floating number)
unsigned int exponent(unsigned int number) {
unsigned int exponent_float(unsigned int number) {
unsigned int exponent = 2139095040; unsigned int exponent = 2139095040;
return (number & exponent) >> 23; return (number & exponent) >> 23;
} }
// adding two precision together // adding two precision together
unsigned int addition_precision(unsigned int p1, unsigned int p2) {
return addition(p1, p2);
unsigned int addition_precision_float(unsigned int p1, unsigned int p2) {
return addition_uint(p1, p2);
} }
// writing number out of sign, exponent and precision // writing number out of sign, exponent and precision
unsigned int output(unsigned int sign, unsigned int exponent, unsigned int precision) {
unsigned int output_float(unsigned int sign, unsigned int exponent, unsigned int precision) {
return (sign << 31) | (exponent << 23) | precision; return (sign << 31) | (exponent << 23) | precision;
} }
@ -83,20 +83,20 @@ float addition_float(float number1, float number2) {
unsigned int e = 8388608; unsigned int e = 8388608;
struct data num1, num2, num3; struct data num1, num2, num3;
num1.number.floating = number1, num2.number.floating = number2; num1.number.floating = number1, num2.number.floating = number2;
num1.sign = sign(num1.number.integer), num2.sign = sign(num2.number.integer);
num1.exponent = exponent(num1.number.integer), num2.exponent = exponent(num2.number.integer);
num1.precision = precision(num1.number.integer) | e, num2.precision = precision(num2.number.integer) | e;
num1.sign = sign_float(num1.number.integer), num2.sign = sign_float(num2.number.integer);
num1.exponent = exponent_float(num1.number.integer), num2.exponent = exponent_float(num2.number.integer);
num1.precision = precision_float(num1.number.integer) | e, num2.precision = precision_float(num2.number.integer) | e;
num3.precision = addition_precision(num1.precision, num2.precision >> (num1.exponent - num2.exponent));
num3.precision = addition_precision_float(num1.precision, num2.precision >> (num1.exponent - num2.exponent));
if (num3.precision > 16777215) { if (num3.precision > 16777215) {
num3.exponent = addition(num1.exponent, 1);
num3.exponent = addition_uint(num1.exponent, 1);
num3.precision = (num3.precision >> 1); num3.precision = (num3.precision >> 1);
} }
else { else {
num3.exponent = num1.exponent; num3.exponent = num1.exponent;
} }
num3.precision ^= e; num3.precision ^= e;
num3.number.integer = output(num1.sign, num3.exponent, num3.precision);
num3.number.integer = output_float(num1.sign, num3.exponent, num3.precision);
return num3.number.floating; return num3.number.floating;
} }

12
src/addition.h

@ -7,17 +7,17 @@ struct data;
void full_adder (num* sum, num* nextcarry, num number1, num number2, num carry); void full_adder (num* sum, num* nextcarry, num number1, num number2, num carry);
unsigned int addition(num number1, num number2);
unsigned int addition_uint(num number1, num number2);
unsigned int sign(unsigned int number);
unsigned int sign_float(unsigned int number);
unsigned int precision(unsigned int number);
unsigned int precision_float(unsigned int number);
unsigned int exponent(unsigned int number);
unsigned int exponent_float(unsigned int number);
unsigned int addition_precision(unsigned int p1, unsigned int p2);
unsigned int addition_precision_float(unsigned int p1, unsigned int p2);
unsigned int output(unsigned int sign, unsigned int exponent, unsigned int precision);
unsigned int output_float(unsigned int sign, unsigned int exponent, unsigned int precision);
float addition_float(float number1, float number2); float addition_float(float number1, float number2);

76
test/test_addition.c

@ -87,7 +87,7 @@ void test_addition_addition_basecasezeropluszeroequalzero(void)
unsigned int result; unsigned int result;
unsigned int expected = 0; unsigned int expected = 0;
result = addition(0, 0);
result = addition_uint(0, 0);
TEST_ASSERT_EQUAL_UINT(expected, result); TEST_ASSERT_EQUAL_UINT(expected, result);
} }
@ -97,8 +97,8 @@ void test_addition_addition_basecaseonescolumns(void)
unsigned int result[2]; unsigned int result[2];
unsigned int expected[2] = { 1, 1 }; unsigned int expected[2] = { 1, 1 };
result[0] = addition(1, 0);
result[1] = addition(0, 1);
result[0] = addition_uint(1, 0);
result[1] = addition_uint(0, 1);
TEST_ASSERT_EQUAL_UINT(expected[0], result[0]); TEST_ASSERT_EQUAL_UINT(expected[0], result[0]);
TEST_ASSERT_EQUAL_UINT(expected[1], result[1]); TEST_ASSERT_EQUAL_UINT(expected[1], result[1]);
@ -109,11 +109,11 @@ void test_addition_addition_basecasetotenscolumns(void)
unsigned int result[5]; unsigned int result[5];
unsigned int expected[5] = { 3, 3, 2, 3, 3 }; unsigned int expected[5] = { 3, 3, 2, 3, 3 };
result[0] = addition(0, 3);
result[1] = addition(1, 2);
result[2] = addition(1, 1);
result[3] = addition(2, 1);
result[4] = addition(3, 0);
result[0] = addition_uint(0, 3);
result[1] = addition_uint(1, 2);
result[2] = addition_uint(1, 1);
result[3] = addition_uint(2, 1);
result[4] = addition_uint(3, 0);
TEST_ASSERT_EQUAL_UINT(expected[0], result[0]); TEST_ASSERT_EQUAL_UINT(expected[0], result[0]);
TEST_ASSERT_EQUAL_UINT(expected[1], result[1]); TEST_ASSERT_EQUAL_UINT(expected[1], result[1]);
@ -127,11 +127,11 @@ void test_addition_addition_allunsignedinteger(void)
unsigned int result[5]; unsigned int result[5];
unsigned int expected[5] = { 88879736, __UINT32_MAX__, 66558, __UINT32_MAX__, 477905879 }; unsigned int expected[5] = { 88879736, __UINT32_MAX__, 66558, __UINT32_MAX__, 477905879 };
result[0] = addition(13456275, 75423461);
result[1] = addition(4294967294, 1);
result[2] = addition(1023, 65535);
result[3] = addition(0, 4294967295);
result[4] = addition(54321567,423584312);
result[0] = addition_uint(13456275, 75423461);
result[1] = addition_uint(4294967294, 1);
result[2] = addition_uint(1023, 65535);
result[3] = addition_uint(0, 4294967295);
result[4] = addition_uint(54321567,423584312);
TEST_ASSERT_EQUAL_UINT(expected[0], result[0]); TEST_ASSERT_EQUAL_UINT(expected[0], result[0]);
TEST_ASSERT_EQUAL_UINT(expected[1], result[1]); TEST_ASSERT_EQUAL_UINT(expected[1], result[1]);
@ -146,8 +146,8 @@ void test_addition_signfloatingnumber(void)
unsigned int expected[2] = { 0, 1 }; unsigned int expected[2] = { 0, 1 };
number[0].floating = 1, number[1].floating = -1; number[0].floating = 1, number[1].floating = -1;
result[0] = sign(number[0].integer);
result[1] = sign(number[1].integer);
result[0] = sign_float(number[0].integer);
result[1] = sign_float(number[1].integer);
TEST_ASSERT_EQUAL_UINT(expected[0], result[0]); TEST_ASSERT_EQUAL_UINT(expected[0], result[0]);
TEST_ASSERT_EQUAL_UINT(expected[1], result[1]); TEST_ASSERT_EQUAL_UINT(expected[1], result[1]);
@ -159,11 +159,11 @@ void test_addition_precisionfloatingnumber(void)
number[0].floating = 0, number[1].floating = -34753168, number[2].floating = 75613594, number[3].floating = -0.00000044568721, number[4].floating = 0.0000004796123; number[0].floating = 0, number[1].floating = -34753168, number[2].floating = 75613594, number[3].floating = -0.00000044568721, number[4].floating = 0.0000004796123;
unsigned int expected[5] = { ( number[0].integer << 9) >> 9 , ( number[1].integer << 9) >> 9, ( number[2].integer << 9) >> 9, ( number[3].integer << 9) >> 9, ( number[4].integer << 9) >> 9}; unsigned int expected[5] = { ( number[0].integer << 9) >> 9 , ( number[1].integer << 9) >> 9, ( number[2].integer << 9) >> 9, ( number[3].integer << 9) >> 9, ( number[4].integer << 9) >> 9};
result[0] = precision( number[0].integer );
result[1] = precision( number[1].integer );
result[2] = precision( number[2].integer );
result[3] = precision( number[3].integer );
result[4] = precision( number[4].integer );
result[0] = precision_float( number[0].integer );
result[1] = precision_float( number[1].integer );
result[2] = precision_float( number[2].integer );
result[3] = precision_float( number[3].integer );
result[4] = precision_float( number[4].integer );
TEST_ASSERT_EQUAL_UINT(expected[0], result[0]); TEST_ASSERT_EQUAL_UINT(expected[0], result[0]);
TEST_ASSERT_EQUAL_UINT(expected[1], result[1]); TEST_ASSERT_EQUAL_UINT(expected[1], result[1]);
@ -178,11 +178,11 @@ void test_addition_exponentfloatingnumber(void)
number[0].floating = 0, number[1].floating = -762134982, number[2].floating = 47621349, number[3].floating = -0.0000078961354, number[4].floating = 0.00001568943; number[0].floating = 0, number[1].floating = -762134982, number[2].floating = 47621349, number[3].floating = -0.0000078961354, number[4].floating = 0.00001568943;
unsigned int expected[5] = { ( number[0].integer << 1) >> 24 , ( number[1].integer << 1) >> 24, ( number[2].integer << 1) >> 24, ( number[3].integer << 1) >> 24, ( number[4].integer << 1) >> 24}; unsigned int expected[5] = { ( number[0].integer << 1) >> 24 , ( number[1].integer << 1) >> 24, ( number[2].integer << 1) >> 24, ( number[3].integer << 1) >> 24, ( number[4].integer << 1) >> 24};
result[0] = exponent( number[0].integer );
result[1] = exponent( number[1].integer );
result[2] = exponent( number[2].integer );
result[3] = exponent( number[3].integer );
result[4] = exponent( number[4].integer );
result[0] = exponent_float( number[0].integer );
result[1] = exponent_float( number[1].integer );
result[2] = exponent_float( number[2].integer );
result[3] = exponent_float( number[3].integer );
result[4] = exponent_float( number[4].integer );
TEST_ASSERT_EQUAL_UINT(expected[0], result[0]); TEST_ASSERT_EQUAL_UINT(expected[0], result[0]);
TEST_ASSERT_EQUAL_UINT(expected[1], result[1]); TEST_ASSERT_EQUAL_UINT(expected[1], result[1]);
@ -195,17 +195,17 @@ void test_addition_addition_precision_positivnumberlowerthan2tothepowerof24(void
{ {
unsigned int result[2]; unsigned int result[2];
number[0].floating = 652468761.2348, number[1].floating = 2.675312546943, number[2].floating = 321647956212.2146, number[3].floating = 0.00000324567861, number[4].floating = number[0].floating + number[1].floating; number[5].floating = number[2].floating + number[3].floating; number[0].floating = 652468761.2348, number[1].floating = 2.675312546943, number[2].floating = 321647956212.2146, number[3].floating = 0.00000324567861, number[4].floating = number[0].floating + number[1].floating; number[5].floating = number[2].floating + number[3].floating;
unsigned int expected[2] = { precision(number[4].integer), precision(number[5].integer) };
unsigned int expected[2] = { precision_float(number[4].integer), precision_float(number[5].integer) };
unsigned int e0, e1, e2, e3, p0, p1, p2, p3; unsigned int e0, e1, e2, e3, p0, p1, p2, p3;
e0 = exponent(number[0].integer), e1 = exponent(number[1].integer), e2 = exponent(number[2].integer), e3 = exponent(number[3].integer);
p0 = precision(number[0].integer) | e, p1 = precision(number[1].integer) | e, p2 = precision(number[2].integer) | e, p3 = precision(number[3].integer) | e;
e0 = exponent_float(number[0].integer), e1 = exponent_float(number[1].integer), e2 = exponent_float(number[2].integer), e3 = exponent_float(number[3].integer);
p0 = precision_float(number[0].integer) | e, p1 = precision_float(number[1].integer) | e, p2 = precision_float(number[2].integer) | e, p3 = precision_float(number[3].integer) | e;
p1 >>= e0 - e1, p3 >>= e2 - e3; p1 >>= e0 - e1, p3 >>= e2 - e3;
result[0] = addition_precision( p0, p1 ) ^ e;
result[1] = addition_precision( p2, p3 ) ^ e;
result[0] = addition_precision_float( p0, p1 ) ^ e;
result[1] = addition_precision_float( p2, p3 ) ^ e;
TEST_ASSERT_EQUAL_UINT(expected[0], result[0]); TEST_ASSERT_EQUAL_UINT(expected[0], result[0]);
TEST_ASSERT_EQUAL_UINT(expected[1], result[1]); TEST_ASSERT_EQUAL_UINT(expected[1], result[1]);
@ -219,14 +219,14 @@ void test_addition_output_numberwithsignexponentprecision(void)
unsigned int s0, s1, s2, s3, s4, e0, e1, e2, e3, e4, p0, p1, p2, p3, p4; unsigned int s0, s1, s2, s3, s4, e0, e1, e2, e3, e4, p0, p1, p2, p3, p4;
s0 = sign(number[0].integer), s1 = sign(number[1].integer), s2 = sign(number[2].integer), s3 = sign(number[3].integer), s4 = sign(number[4].integer);
e0 = exponent(number[0].integer), e1 = exponent(number[1].integer), e2 = exponent(number[2].integer), e3 = exponent(number[3].integer), e4 = exponent(number[4].integer);
p0 = precision(number[0].integer), p1 = precision(number[1].integer), p2 = precision(number[2].integer), p3 = precision(number[3].integer), p4 = precision(number[4].integer);
result[0] = output(s0, e0, p0);
result[1] = output(s1, e1, p1);
result[2] = output(s2, e2, p2);
result[3] = output(s3, e3, p3);
result[4] = output(s4, e4, p4);
s0 = sign_float(number[0].integer), s1 = sign_float(number[1].integer), s2 = sign_float(number[2].integer), s3 = sign_float(number[3].integer), s4 = sign_float(number[4].integer);
e0 = exponent_float(number[0].integer), e1 = exponent_float(number[1].integer), e2 = exponent_float(number[2].integer), e3 = exponent_float(number[3].integer), e4 = exponent_float(number[4].integer);
p0 = precision_float(number[0].integer), p1 = precision_float(number[1].integer), p2 = precision_float(number[2].integer), p3 = precision_float(number[3].integer), p4 = precision_float(number[4].integer);
result[0] = output_float(s0, e0, p0);
result[1] = output_float(s1, e1, p1);
result[2] = output_float(s2, e2, p2);
result[3] = output_float(s3, e3, p3);
result[4] = output_float(s4, e4, p4);
TEST_ASSERT_EQUAL_UINT(expected[0], result[0]); TEST_ASSERT_EQUAL_UINT(expected[0], result[0]);
TEST_ASSERT_EQUAL_UINT(expected[1], result[1]); TEST_ASSERT_EQUAL_UINT(expected[1], result[1]);

Loading…
Cancel
Save