@@ -3736,4 +3736,130 @@ TEST(Core_SoftFloat, sincos64)
3736
3736
}
3737
3737
}
3738
3738
3739
+ TEST (Core_SoftFloat, CvRound)
3740
+ {
3741
+ struct
3742
+ {
3743
+ uint64_t inVal;
3744
+ int64_t out64;
3745
+ int32_t out32;
3746
+ } _values[] =
3747
+ {
3748
+ { 0x0123456789abcdefU , 0 , 0 }, // 3.51270056408850369812238561681E-303
3749
+ { 0x0000000000000000U , 0 , 0 }, // 0
3750
+ { 0x8000000000000000U , 0 , 0 }, // -0
3751
+ { 0x000123456789abcdU , 0 , 0 }, // 1.5822747438273385725152200433E-309
3752
+ { 0x800123456789abcdU , 0 , 0 }, // -1.5822747438273385725152200433E-309
3753
+ { 0x7ff0000000000000U , INT64_MAX, INT32_MAX }, // +inf
3754
+ { 0xfff0000000000000U , INT64_MIN, INT32_MIN }, // -inf
3755
+ { 0x7ff0000000000001U , INT64_MAX, INT32_MAX }, // nan(casts to maximum value)
3756
+ { 0xfff0000000000001U , INT64_MAX, INT32_MAX }, // nan(casts to maximum value)
3757
+ { 0x7ffa5a5a5a5a5a5aU , INT64_MAX, INT32_MAX }, // nan(casts to maximum value)
3758
+ { 0xfffa5a5a5a5a5a5aU , INT64_MAX, INT32_MAX }, // nan(casts to maximum value)
3759
+ { 0x7fe123456789abcdU , INT64_MAX, INT32_MAX }, // 9.627645455595956656406699747E307
3760
+ { 0xffe123456789abcdU , INT64_MIN, INT32_MIN }, // -9.627645455595956656406699747E307
3761
+ { 0x43ffffffffffffffU , INT64_MAX, INT32_MAX }, // (2^53-1)*2^12
3762
+ { 0xc3ffffffffffffffU , INT64_MIN, INT32_MIN }, // -(2^53-1)*2^12
3763
+ { 0x43f0000000000000U , INT64_MAX, INT32_MAX }, // 2^64
3764
+ { 0xc3f0000000000000U , INT64_MIN, INT32_MIN }, // -2^64
3765
+ { 0x43efffffffffffffU , INT64_MAX, INT32_MAX }, // (2^53-1)*2^11
3766
+ { 0xc3efffffffffffffU , INT64_MIN, INT32_MIN }, // -(2^53-1)*2^11
3767
+ { 0x43e0000000000000U , INT64_MAX, INT32_MAX }, // 2^63
3768
+ { 0xc3e0000000000000U , -0x7fffffffffffffff -1 , INT32_MIN }, // -2^63
3769
+ { 0x43dfffffffffffffU , 0x7ffffffffffffc00 , INT32_MAX }, // (2^53-1)*2^10
3770
+ { 0xc3dfffffffffffffU , -0x7ffffffffffffc00 , INT32_MIN }, // -(2^53-1)*2^10
3771
+ { 0x433fffffffffffffU , 0x1fffffffffffff , INT32_MAX }, // (2^53-1)
3772
+ { 0xc33fffffffffffffU , -0x1fffffffffffff , INT32_MIN }, // -(2^53-1)
3773
+ { 0x432fffffffffffffU , 0x10000000000000 , INT32_MAX }, // (2^52-1) + 0.5
3774
+ { 0xc32fffffffffffffU , -0x10000000000000 , INT32_MIN }, // -(2^52-1) - 0.5
3775
+ { 0x431fffffffffffffU , 0x8000000000000 , INT32_MAX }, // (2^51-1) + 0.75
3776
+ { 0xc31fffffffffffffU , -0x8000000000000 , INT32_MIN }, // -(2^51-1) - 0.75
3777
+ { 0x431ffffffffffffeU , 0x8000000000000 , INT32_MAX }, // (2^51-1) + 0.5
3778
+ { 0xc31ffffffffffffeU , -0x8000000000000 , INT32_MIN }, // -(2^51-1) - 0.5
3779
+ { 0x431ffffffffffffdU , 0x7ffffffffffff , INT32_MAX }, // (2^51-1) + 0.25
3780
+ { 0xc31ffffffffffffdU , -0x7ffffffffffff , INT32_MIN }, // -(2^51-1) - 0.25
3781
+
3782
+ { 0x41f0000000000000U , 0x100000000 , INT32_MAX }, // 2^32 = 4294967296
3783
+ { 0xc1f0000000000000U , -0x100000000 , INT32_MIN }, // -2^32 = -4294967296
3784
+ { 0x41efffffffffffffU , 0x100000000 , INT32_MAX }, // 4294967295.99999952316284179688
3785
+ { 0xc1efffffffffffffU , -0x100000000 , INT32_MIN }, // -4294967295.99999952316284179688
3786
+ { 0x41effffffff00000U , 0x100000000 , INT32_MAX }, // (2^32-1) + 0.5 = 4294967295.5
3787
+ { 0xc1effffffff00000U , -0x100000000 , INT32_MIN }, // -(2^32-1) - 0.5 = -4294967295.5
3788
+ { 0x41efffffffe00000U , 0xffffffffll , INT32_MAX }, // (2^32-1)
3789
+ { 0xc1efffffffe00000U , -0xffffffffll , INT32_MIN }, // -(2^32-1)
3790
+ { 0x41e0000000000000U , 0x80000000ll , INT32_MAX }, // 2^31 = 2147483648
3791
+ { 0xc1e0000000000000U , -0x80000000ll , -0x7fffffff -1 }, // -2^31 = -2147483648
3792
+ { 0x41dfffffffffffffU , 0x80000000ll , INT32_MAX }, // 2147483647.99999976158142089844
3793
+ { 0xc1dfffffffffffffU , -0x80000000ll , -0x7fffffff -1 }, // -2147483647.99999976158142089844
3794
+
3795
+ { 0x41dffffffff00000U , 0x80000000ll , INT32_MAX }, // (2^31-1) + 0.75
3796
+ { 0xc1dffffffff00000U , -0x80000000ll , -0x7fffffff -1 }, // -(2^31-1) - 0.75
3797
+ { 0x41dfffffffe00001U , 0x80000000ll , INT32_MAX }, // (2^31-1) + 0.5 + 2^-22
3798
+ { 0xc1dfffffffe00001U , -0x80000000ll , -0x7fffffff -1 }, // -(2^31-1) - 0.5 - 2^-22
3799
+ { 0x41dfffffffe00000U , 0x80000000ll , INT32_MAX }, // (2^31-1) + 0.5
3800
+ { 0xc1dfffffffe00000U , -0x80000000ll , -0x7fffffff -1 }, // -(2^31-1) - 0.5
3801
+ { 0x41dfffffffdfffffU , 0x7fffffff , 0x7fffffff }, // (2^31-1) + 0.5 - 2^-22
3802
+ { 0xc1dfffffffdfffffU , -0x7fffffff , -0x7fffffff }, // -(2^31-1) - 0.5 + 2^-22
3803
+ { 0x41dfffffffd00000U , 0x7fffffff , 0x7fffffff }, // (2^31-1) + 0.25
3804
+ { 0xc1dfffffffd00000U , -0x7fffffff , -0x7fffffff }, // -(2^31-1) - 0.25
3805
+ { 0x41dfffffffc00000U , 0x7fffffff , 0x7fffffff }, // (2^31-1)
3806
+ { 0xc1dfffffffc00000U , -0x7fffffff , -0x7fffffff }, // -(2^31-1)
3807
+ { 0x41d0000000000000U , 0x40000000 , 0x40000000 }, // 2^30 = 2147483648
3808
+ { 0xc1d0000000000000U , -0x40000000 , -0x40000000 }, // -2^30 = -2147483648
3809
+
3810
+ { 0x4006000000000000U , 3 , 3 }, // 2.75
3811
+ { 0xc006000000000000U , -3 , -3 }, // -2.75
3812
+ { 0x4004000000000001U , 3 , 3 }, // 2.5 + 2^-51
3813
+ { 0xc004000000000001U , -3 , -3 }, // -2.5 - 2^-51
3814
+ { 0x4004000000000000U , 2 , 2 }, // 2.5
3815
+ { 0xc004000000000000U , -2 , -2 }, // -2.5
3816
+ { 0x4003ffffffffffffU , 2 , 2 }, // 2.5 - 2^-51
3817
+ { 0xc003ffffffffffffU , -2 , -2 }, // -2.5 + 2^-51
3818
+ { 0x4002000000000000U , 2 , 2 }, // 2.25
3819
+ { 0xc002000000000000U , -2 , -2 }, // -2.25
3820
+
3821
+ { 0x3ffc000000000000U , 2 , 2 }, // 1.75
3822
+ { 0xbffc000000000000U , -2 , -2 }, // -1.75
3823
+ { 0x3ff8000000000001U , 2 , 2 }, // 1.5 + 2^-52
3824
+ { 0xbff8000000000001U , -2 , -2 }, // -1.5 - 2^-52
3825
+ { 0x3ff8000000000000U , 2 , 2 }, // 1.5
3826
+ { 0xbff8000000000000U , -2 , -2 }, // -1.5
3827
+ { 0x3ff7ffffffffffffU , 1 , 1 }, // 1.5 - 2^-52
3828
+ { 0xbff7ffffffffffffU , -1 , -1 }, // -1.5 + 2^-52
3829
+ { 0x3ff4000000000000U , 1 , 1 }, // 1.25
3830
+ { 0xbff4000000000000U , -1 , -1 }, // -1.25
3831
+
3832
+ { 0x3fe8000000000000U , 1 , 1 }, // 0.75
3833
+ { 0xbfe8000000000000U , -1 , -1 }, // -0.75
3834
+ { 0x3fe0000000000001U , 1 , 1 }, // 0.5 + 2^-53
3835
+ { 0xbfe0000000000001U , -1 , -1 }, // -0.5 - 2^-53
3836
+ { 0x3fe0000000000000U , 0 , 0 }, // 0.5
3837
+ { 0xbfe0000000000000U , 0 , 0 }, // -0.5
3838
+
3839
+ { 0x3fd8000000000000U , 0 , 0 }, // 0.375
3840
+ { 0xbfd8000000000000U , 0 , 0 }, // -0.375
3841
+ { 0x3fd0000000000000U , 0 , 0 }, // 0.25
3842
+ { 0xbfd0000000000000U , 0 , 0 }, // -0.25
3843
+
3844
+ { 0x0ff123456789abcdU , 0 , 0 }, // 6.89918601543515033558134828315E-232
3845
+ { 0x8ff123456789abcdU , 0 , 0 } // -6.89918601543515033558134828315E-232
3846
+ };
3847
+ struct testvalues
3848
+ {
3849
+ softdouble inVal;
3850
+ int64_t out64;
3851
+ int32_t out32;
3852
+ } *values = (testvalues*)_values;
3853
+
3854
+ for (int i = 0 , maxi = sizeof (_values) / sizeof (_values[0 ]); i < maxi; i++)
3855
+ {
3856
+ EXPECT_EQ (values[i].out64 , cvRound64 (values[i].inVal ));
3857
+ EXPECT_EQ (values[i].out64 , saturate_cast<int64_t >(values[i].inVal ));
3858
+ EXPECT_EQ ((uint64_t )(values[i].out64 ), saturate_cast<uint64_t >(values[i].inVal ));
3859
+ EXPECT_EQ (values[i].out32 , cvRound (values[i].inVal ));
3860
+ EXPECT_EQ (values[i].out32 , saturate_cast<int32_t >(values[i].inVal ));
3861
+ EXPECT_EQ ((uint32_t )(values[i].out32 ), saturate_cast<uint32_t >(values[i].inVal ));
3862
+ }
3863
+ }
3864
+
3739
3865
/* End of file. */
0 commit comments