From 1dd59f6bd613daa060e1c8f4acd38358bb0c69bf Mon Sep 17 00:00:00 2001 From: Anton Gerasimov <anton.gerasimov@dawndata.tech> Date: Mon, 21 Jun 2021 17:21:17 +0100 Subject: [PATCH] sums with unit_test --- dap-sdk/core/test/math/unit_test.cpp | 233 +++++++++++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 dap-sdk/core/test/math/unit_test.cpp diff --git a/dap-sdk/core/test/math/unit_test.cpp b/dap-sdk/core/test/math/unit_test.cpp new file mode 100644 index 0000000000..6e7ebf4fd8 --- /dev/null +++ b/dap-sdk/core/test/math/unit_test.cpp @@ -0,0 +1,233 @@ +#include <boost/multiprecision/cpp_int.hpp> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include "dap_math_ops.h" +#include <cmath> +#include <iostream> +#include <fstream> + +int main() +{ + using namespace boost::multiprecision; + + //density constant value=2147483646 + std::uint64_t i; + std::uint64_t j; + std::uint64_t k; + std::uint64_t l; + std::uint64_t msb_one=0x7fffffffffffffff; + std::uint64_t lsb_one=1; + boost::uint64_t max_64=(std::numeric_limits<boost::uint64_t>::max)(); + int density_constant=40000; + //2147483646 + int density_index; + int error_counter_sum_64_128=0; + + + unsign256_t dap_test_256_one; + unsign256_t dap_test_256_two; + unsign256_t dap_test_256_sum; + int overflow_flag; + + //otherwise the sum structure is filled with garbage + dap_test_256_sum.lo.lo=0; + dap_test_256_sum.lo.hi=0; + dap_test_256_sum.hi.lo=0; + dap_test_256_sum.hi.hi=0; + + std::ofstream sum_256_256_file; + sum_256_256_file.open ("SUM_256_256.txt"); + + + uint128_t hi_64{"0xffffffffffffffff0000000000000000"}; + uint128_t lo_64{"0x0000000000000000ffffffffffffffff"}; + uint128_t max_128{"0xffffffffffffffffffffffffffffffff"}; + + uint128_t two_64{"0x000000000000000010000000000000000"}; + + + + uint256_t boost_two_64{"0x00000000000000000000000000000000010000000000000000"}; + uint256_t boost_two_128{"0x0000000000000000100000000000000000000000000000000"}; + uint256_t boost_two_192{"0x1000000000000000000000000000000000000000000000000"}; + + + + uint256_t boost_test_256_one; + uint256_t boost_test_256_two; + uint256_t boost_test_256_sum; + + uint256_t boost_dap_256_comparison; + + + + uint128_t boost_dap_64_128_comparison; + + int error_counter_sum=0; + int error_counter_prod=0; + int verbose_output=0; + + + for (density_index = 0; density_index<density_constant; density_index+=1000){ + + i=density_index; + j=2*density_index; + k=3*density_index; + l=4*density_index; + + dap_test_256_one.lo.lo=i; + dap_test_256_one.lo.hi=j; + dap_test_256_one.hi.lo=k; + dap_test_256_one.hi.hi=l; + + + uint256_t boost_test_256_one_coeff_2_0=i; + uint256_t boost_test_256_one_coeff_2_64=j; + uint256_t boost_test_256_one_coeff_2_128=k; + uint256_t boost_test_256_one_coeff_2_192=l; + + + + boost_test_256_one=boost_test_256_one_coeff_2_0 + boost_test_256_one_coeff_2_64*boost_two_64 + +boost_test_256_one_coeff_2_128*boost_two_128+boost_test_256_one_coeff_2_192*boost_two_192; + + + i=max_64-(density_index+1); + j=max_64-2*(density_index+1); + k=max_64-3*(density_index+1); + l=max_64-4*(density_index+1); + dap_test_256_two.lo.lo=i; + dap_test_256_two.lo.hi=j; + dap_test_256_two.hi.lo=k; + dap_test_256_two.hi.hi=l; + + uint256_t boost_test_256_two_coeff_2_0=i; + uint256_t boost_test_256_two_coeff_2_64=j; + uint256_t boost_test_256_two_coeff_2_128=k; + uint256_t boost_test_256_two_coeff_2_192=l; + + + boost_test_256_two=boost_test_256_two_coeff_2_0 + boost_test_256_two_coeff_2_64*boost_two_64 + +boost_test_256_two_coeff_2_128*boost_two_128+boost_test_256_two_coeff_2_192*boost_two_192; + + + +// add(boost_add_256, i, j); + overflow_flag=SUM_256_256(dap_test_256_one,dap_test_256_two,&dap_test_256_sum); + boost_test_256_sum=add(boost_test_256_sum,boost_test_256_one,boost_test_256_two); + + boost_dap_256_comparison=dap_test_256_sum.lo.lo+dap_test_256_sum.lo.hi*boost_two_64+ + dap_test_256_sum.hi.lo*boost_two_128+dap_test_256_sum.hi.hi*boost_two_192; + + if(boost_dap_256_comparison!=boost_test_256_sum){ + error_counter_sum+=1; + sum_256_256_file << "incorrect output for density index=" << std::endl; + sum_256_256_file << density_index << std::endl;} + + + +// unsign128_t dap_test_64_128_prod; +// uint128_t boost_test_64_128_prod; +// uint128_t boost_dap_128_prod_comparison; +// +// multiply(boost_test_64_128_prod, i, j); +// MULT_64_128(i,j,dap_test_64_128_prod); +// boost_dap_128_prod_comparison=dap_test_64_128_prod.lo+dap_test_64_128_prod.hi*hi_64; +// +// if(boost_dap_128_prod_comparison!=boost_test_64_128_prod){ +// error_counter_prod+=1;} +// + + + if(verbose_output==1){ + + if(boost_dap_256_comparison!=boost_test_256_sum){ + + sum_256_256_file << "dap_test_256_one"<< std::endl; + + sum_256_256_file << (dap_test_256_one.lo.lo)<< std::endl; + sum_256_256_file << (dap_test_256_one.lo.hi)<< std::endl; + sum_256_256_file << (dap_test_256_one.hi.lo)<< std::endl; + sum_256_256_file << (dap_test_256_one.hi.hi)<< std::endl; + + + sum_256_256_file << "dap_test_256_two"<< std::endl; + + sum_256_256_file << (dap_test_256_two.lo.lo)<< std::endl; + sum_256_256_file << (dap_test_256_two.lo.hi)<< std::endl; + sum_256_256_file << (dap_test_256_two.hi.lo)<< std::endl; + sum_256_256_file << (dap_test_256_two.hi.hi)<< std::endl; + + sum_256_256_file << "dap_test_256_sum"<< std::endl; + + sum_256_256_file << (dap_test_256_sum.lo.lo)<< std::endl; + sum_256_256_file << (dap_test_256_sum.lo.hi)<< std::endl; + sum_256_256_file << (dap_test_256_sum.hi.lo)<< std::endl; + sum_256_256_file << (dap_test_256_sum.hi.hi)<< std::endl; + + sum_256_256_file << "boost_test_256_one"<< std::endl; + + sum_256_256_file << (boost_test_256_one)<< std::endl; + + sum_256_256_file << "boost_test_256_one factor 0"<< std::endl; + + sum_256_256_file << (boost_test_256_one_coeff_2_0)<< std::endl; + + sum_256_256_file << "boost_test_256_one factor 1"<< std::endl; + + sum_256_256_file << (boost_test_256_one_coeff_2_64*boost_two_64)<< std::endl; + + sum_256_256_file << "boost_test_256_one factor 2"<< std::endl; + + sum_256_256_file << (boost_test_256_one_coeff_2_128*boost_two_128)<< std::endl; + + + sum_256_256_file << "boost_test_256_one factor 3"<< std::endl; + + sum_256_256_file << (boost_test_256_one_coeff_2_192*boost_two_192)<< std::endl; + + + + sum_256_256_file << "boost_test_256_two"<< std::endl; + + sum_256_256_file << (boost_test_256_two)<< std::endl; + + + sum_256_256_file << "boost sum is"<< std::endl; + + + sum_256_256_file << (boost_test_256_sum)<< std::endl; + + sum_256_256_file << "boost comparison is"<< std::endl; + + + sum_256_256_file << (boost_dap_256_comparison)<< std::endl;} + + + + +} + + + overflow_flag=0; + + } + + + sum_256_256_file.close(); + + if(error_counter_sum==0){ + + std::cout<< "SUM_256_256 returns identical results to boost:: 256 bit addition"<< std::endl;} + + + if(error_counter_prod==0){ + + std::cout<< "SUM_256_256 returns identical results to boost:: 256 bit addition"<< std::endl;} + + + return 0; +} + + -- GitLab