diff --git a/modules/core/src/matmul.simd.hpp b/modules/core/src/matmul.simd.hpp index 6f77adc68b..a64cd7ba6a 100644 --- a/modules/core/src/matmul.simd.hpp +++ b/modules/core/src/matmul.simd.hpp @@ -2536,8 +2536,7 @@ double dotProd_16s(const short* src1, const short* src2, int len) double dotProd_32s(const int* src1, const int* src2, int len) { -#if CV_SIMD_64F // TODO: enable for CV_SIMD_SCALABLE_64F -// Test failed on RVV(QEMU): Too big difference (=1.20209e-08 > 1.11022e-12) +#if CV_SIMD_64F || CV_SIMD_SCALABLE_64F double r = .0; int i = 0; const int step = VTraits::vlanes(); diff --git a/modules/core/test/test_math.cpp b/modules/core/test/test_math.cpp index 024177f1a1..dc9153680c 100644 --- a/modules/core/test/test_math.cpp +++ b/modules/core/test/test_math.cpp @@ -477,8 +477,9 @@ class Core_DotProductTest : public Core_MatrixTest public: Core_DotProductTest(); protected: - void run_func(); - void prepare_to_validation( int test_case_idx ); + void run_func() CV_OVERRIDE; + void prepare_to_validation( int test_case_idx ) CV_OVERRIDE; + double get_success_error_level( int test_case_idx, int i, int j ) CV_OVERRIDE; }; @@ -498,6 +499,15 @@ void Core_DotProductTest::prepare_to_validation( int ) test_mat[REF_OUTPUT][0].at(0,0) = Scalar(cvtest::crossCorr( test_mat[INPUT][0], test_mat[INPUT][1] )); } +double Core_DotProductTest::get_success_error_level( int test_case_idx, int i, int j ) +{ +#ifdef __riscv + const int depth = test_mat[i][j].depth(); + if (depth == CV_64F) + return 1.7e-5; +#endif + return Core_MatrixTest::get_success_error_level( test_case_idx, i, j ); +} ///////// crossproduct ////////// diff --git a/modules/imgproc/test/test_histograms.cpp b/modules/imgproc/test/test_histograms.cpp index b6a97ef395..2460fd92f0 100644 --- a/modules/imgproc/test/test_histograms.cpp +++ b/modules/imgproc/test/test_histograms.cpp @@ -1078,6 +1078,7 @@ int CV_CompareHistTest::validate_test_results( int /*test_case_idx*/ ) i == CV_COMP_BHATTACHARYYA ? "Bhattacharyya" : i == CV_COMP_KL_DIV ? "Kullback-Leibler" : "Unknown"; + const auto thresh = FLT_EPSILON*14*MAX(fabs(v0),0.17); if( cvIsNaN(v) || cvIsInf(v) ) { ts->printf( cvtest::TS::LOG, "The comparison result using the method #%d (%s) is invalid (=%g)\n", @@ -1085,7 +1086,7 @@ int CV_CompareHistTest::validate_test_results( int /*test_case_idx*/ ) code = cvtest::TS::FAIL_INVALID_OUTPUT; break; } - else if( fabs(v0 - v) > FLT_EPSILON*14*MAX(fabs(v0),0.1) ) + else if( fabs(v0 - v) > thresh ) { ts->printf( cvtest::TS::LOG, "The comparison result using the method #%d (%s)\n\tis inaccurate (=%g, should be =%g)\n", i, method_name, v, v0 );