1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
#include <bit/int96.h>
#include "unit.h"
#define check(expr) if (!(expr)) printf("failed at %s:%d\n", __FILE__, __LINE__)
static void
test()
{
header();
const uint64_t a = 0xFFFFFFFFFFFFFFFFull / 2;
int96_num num, num1, num2;
int96_set_unsigned(&num, 0);
int96_set_unsigned(&num1, a);
int96_set_unsigned(&num2, a);
int96_invert(&num2);
check(int96_is_neg_int64(&num2));
check(int96_extract_neg_int64(&num2) == int64_t(-a));
check(int96_is_uint64(&num));
check(int96_extract_uint64(&num) == 0);
int96_add(&num, &num1);
check(int96_is_uint64(&num));
check(int96_extract_uint64(&num) == a);
int96_add(&num, &num1);
check(int96_is_uint64(&num));
check(int96_extract_uint64(&num) == a * 2);
for (int i = 1; i < 1000; i++) {
for(int j = 0; j < i; j++) {
int96_add(&num, &num1);
check(!int96_is_uint64(&num) && !int96_is_neg_int64(&num));
}
for(int j = 0; j < i - 1; j++) {
int96_add(&num, &num2);
check(!int96_is_uint64(&num) && !int96_is_neg_int64(&num));
}
int96_add(&num, &num2);
check(int96_is_uint64(&num));
check(int96_extract_uint64(&num) == a * 2);
}
int96_add(&num, &num2);
check(int96_is_uint64(&num));
check(int96_extract_uint64(&num) == a);
int96_add(&num, &num2);
check(int96_is_uint64(&num));
check(int96_extract_uint64(&num) == 0);
int96_add(&num, &num2);
check(int96_is_neg_int64(&num));
check(int96_extract_neg_int64(&num) == int64_t(-a));
for (int i = 1; i < 1000; i++) {
for(int j = 0; j < i; j++) {
int96_add(&num, &num2);
check(!int96_is_uint64(&num) && !int96_is_neg_int64(&num));
}
for(int j = 0; j < i - 1; j++) {
int96_add(&num, &num1);
check(!int96_is_uint64(&num) && !int96_is_neg_int64(&num));
}
int96_add(&num, &num1);
check(int96_is_neg_int64(&num));
check(int96_extract_neg_int64(&num) == int64_t(-a));
}
footer();
}
int
main(int, const char **)
{
test();
}
|