Dennis Sperzel
11 months ago
3 changed files with 177 additions and 0 deletions
-
29src/addition.c
-
12src/addition.h
-
136test/test_addition.c
@ -0,0 +1,29 @@ |
|||||
|
#include "addition.h" |
||||
|
#include <stdlib.h> |
||||
|
|
||||
|
void full_adder (num* sum, num* nextcarry, num number1, num number2, num carry) { |
||||
|
sum[0] = (number1 % 2) ^ (number2 % 2) ^ (carry % 2); |
||||
|
|
||||
|
nextcarry[0] = ((number1 % 2) & (number2 % 2)) | ((number1 % 2) & (carry % 2)) | ((number2 % 2) & (carry % 2)); |
||||
|
} |
||||
|
|
||||
|
unsigned int addition(num number1, num number2) { |
||||
|
unsigned int result = 0; |
||||
|
num sum[1] = {0}; |
||||
|
num nextcarry[1] = {0}; |
||||
|
|
||||
|
for (int i = 0; i < 8 * sizeof(num); i++) |
||||
|
{ |
||||
|
full_adder(sum, nextcarry, number1, number2, nextcarry[0]); |
||||
|
result ^= (sum[0] << i); |
||||
|
|
||||
|
number1 >>= 1; |
||||
|
number2 >>= 1; |
||||
|
} |
||||
|
|
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
float addition_float(float a, float b) { |
||||
|
return 0.0; |
||||
|
} |
@ -0,0 +1,12 @@ |
|||||
|
#ifndef ADDITION_H |
||||
|
#define ADDITION_H |
||||
|
|
||||
|
typedef unsigned int num; |
||||
|
|
||||
|
void full_adder (num* sum, num* nextcarry, num number1, num number2, num carry); |
||||
|
|
||||
|
unsigned int addition(num a, num b); |
||||
|
|
||||
|
float addition_float(float a, float b); |
||||
|
|
||||
|
#endif // ADDITION_H |
@ -0,0 +1,136 @@ |
|||||
|
#ifdef TEST |
||||
|
|
||||
|
#include "unity.h" |
||||
|
|
||||
|
#include "addition.h" |
||||
|
|
||||
|
num carry[1]; |
||||
|
|
||||
|
void setUp(void) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
void tearDown(void) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
void test_addition_full_adder_nullplusnullgleichnull(void) |
||||
|
{ |
||||
|
num result[1]; |
||||
|
num expected = 0; |
||||
|
|
||||
|
full_adder(result, carry, 0, 0, 0); |
||||
|
|
||||
|
TEST_ASSERT_EQUAL_UINT(expected, result[0]); |
||||
|
} |
||||
|
|
||||
|
void test_addition_full_adder_nullplusnullgleichnullmituebertrag(void) |
||||
|
{ |
||||
|
num result[1]; |
||||
|
num expected = 1; |
||||
|
|
||||
|
full_adder(result, carry, 0, 0, 1); |
||||
|
|
||||
|
TEST_ASSERT_EQUAL_UINT(expected, result[0]); |
||||
|
} |
||||
|
|
||||
|
void test_addition_full_adder_zahlpluszahlgleichsummeohneuebertrag(void) |
||||
|
{ |
||||
|
num result[5]; |
||||
|
num expected[5] = { 0, 1, 1, 1, 1}; |
||||
|
|
||||
|
full_adder((result+0), carry, 1, 0, 1); |
||||
|
full_adder((result+1), carry, 0, 1, 0); |
||||
|
full_adder((result+2), carry, 1, 0, 0); |
||||
|
full_adder((result+3), carry, 0, 0, 1); |
||||
|
full_adder((result+4), carry, 1, 1, 1); |
||||
|
|
||||
|
TEST_ASSERT_EQUAL_UINT(expected[0], result[0]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expected[1], result[1]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expected[2], result[2]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expected[3], result[3]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expected[4], result[4]); |
||||
|
} |
||||
|
|
||||
|
void test_addition_full_adder_completesumwithcarry(void) |
||||
|
{ |
||||
|
num result[5], carryresult[5]; |
||||
|
num expected[5] = { 0, 0, 1, 1, 0}, expectedcarry[5] = { 1, 1, 1, 0, 0}; |
||||
|
|
||||
|
full_adder(result+0, carryresult+0, 0, 1, 1); |
||||
|
full_adder(result+1, carryresult+1, 1, 1, 0); |
||||
|
full_adder(result+2, carryresult+2, 1, 1, 1); |
||||
|
full_adder(result+3, carryresult+3, 0, 1, 0); |
||||
|
full_adder(result+4, carryresult+4, 0, 0, 0); |
||||
|
|
||||
|
TEST_ASSERT_EQUAL_UINT(expected[0], result[0]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expected[1], result[1]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expected[2], result[2]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expected[3], result[3]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expected[4], result[4]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expectedcarry[0], carryresult[0]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expectedcarry[1], carryresult[1]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expectedcarry[2], carryresult[2]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expectedcarry[3], carryresult[3]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expectedcarry[4], carryresult[4]); |
||||
|
} |
||||
|
|
||||
|
void test_addition_addition_basecasezeropluszeroequalzero(void) |
||||
|
{ |
||||
|
unsigned int result; |
||||
|
unsigned int expected = 0; |
||||
|
|
||||
|
result = addition(0, 0); |
||||
|
|
||||
|
TEST_ASSERT_EQUAL_UINT(expected, result); |
||||
|
} |
||||
|
|
||||
|
void test_addition_addition_basecaseonescolumns(void) |
||||
|
{ |
||||
|
unsigned int result[2]; |
||||
|
unsigned int expected[2] = { 1, 1 }; |
||||
|
|
||||
|
result[0] = addition(1, 0); |
||||
|
result[1] = addition(0, 1); |
||||
|
|
||||
|
TEST_ASSERT_EQUAL_UINT(expected[0], result[0]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expected[1], result[1]); |
||||
|
} |
||||
|
|
||||
|
void test_addition_addition_basecasetotenscolumns(void) |
||||
|
{ |
||||
|
unsigned int result[5]; |
||||
|
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); |
||||
|
|
||||
|
TEST_ASSERT_EQUAL_UINT(expected[0], result[0]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expected[1], result[1]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expected[2], result[2]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expected[3], result[3]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expected[4], result[4]); |
||||
|
} |
||||
|
|
||||
|
void test_addition_addition_allunsignedinteger(void) |
||||
|
{ |
||||
|
unsigned int result[5]; |
||||
|
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); |
||||
|
|
||||
|
TEST_ASSERT_EQUAL_UINT(expected[0], result[0]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expected[1], result[1]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expected[2], result[2]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expected[3], result[3]); |
||||
|
TEST_ASSERT_EQUAL_UINT(expected[4], result[4]); |
||||
|
} |
||||
|
|
||||
|
#endif // TEST |
Write
Preview
Loading…
Cancel
Save
Reference in new issue