Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding GreaterThanZero to DoubleUtil.cs #5571

Merged
merged 1 commit into from Jun 28, 2023

Conversation

lindexi
Copy link
Contributor

@lindexi lindexi commented Oct 24, 2021

Description

Benchmark code:

    public class Program
    {
        static void Main(string[] args)
        {
            BenchmarkRunner.Run<Program>();
        }

        [Benchmark]
        [ArgumentsSource(nameof(GetArguments))]
        public bool TestGreaterThanZero(double value)
        {
            return DoubleUtil.GreaterThanZero(value);
        }

        [Benchmark]
        [ArgumentsSource(nameof(GetArguments))]
        public bool TestGreaterThanZero2(double value)
        {
            return DoubleUtil.GreaterThanZero2(value);
        }

        [Benchmark]
        [ArgumentsSource(nameof(GetArguments))]
        public bool TestGreaterThan(double value)
        {
            return DoubleUtil.GreaterThan(value, 0);
        }

        public IEnumerable<double> GetArguments()
        {
            const int count = 10;
            for (int i = 0; i < count; i++)
            {
                yield return i;
            }

            for (double i = 0; i < count; i++)
            {
                yield return i / count;
            }

            for (int i = 0; i < count; i++)
            {
                yield return -i;
            }

            for (double i = 0; i < count; i++)
            {
                yield return -i / count;
            }
        }
    }

    public static class DoubleUtil
    {
        /// <summary>
        /// GreaterThanZero - Returns whether or not the value is greater than zero
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static bool GreaterThanZero2(double value)
        {
            // IsZero = Math.Abs(value) < 10.0 * DBL_EPSILON
            // value > 0 && !IsZero(value) == value > 0 && !(Math.Abs(value) < 10.0 * DBL_EPSILON)
            // = !(value < 10.0 * DBL_EPSILON)
            return value >= 10.0 * DBL_EPSILON;
        }

        public static bool GreaterThanZero(double value)
        {
            if (value > 0)
            {
                // AreClose(double value1, double value2)
                // = (|value1-value2| / (|value1| + |value2| + 10.0)) < DBL_EPSILON
                //
                // AreClose(value, 0) = (|value-0| / (|value| + 0 + 10.0)) < DBL_EPSILON
                // = value / (value + 10.0) < DBL_EPSILON
                double eps = (value + 10.0) * DBL_EPSILON;
                double delta = value;
                return !((-eps < delta) && (eps > delta));
            }
            else
            {
                return false;
            }
        }

        public static bool GreaterThan(double value1, double value2)
        {
            return (value1 > value2) && !AreClose(value1, value2);
        }

        public static bool IsZero(double value)
        {
            return Math.Abs(value) < 10.0 * DBL_EPSILON;
        }

        public static bool AreClose(double value1, double value2)
        {
            //in case they are Infinities (then epsilon check does not work)
            if (value1 == value2) return true;
            // This computes (|value1-value2| / (|value1| + |value2| + 10.0)) < DBL_EPSILON
            double eps = (Math.Abs(value1) + Math.Abs(value2) + 10.0) * DBL_EPSILON;
            double delta = value1 - value2;
            return (-eps < delta) && (eps > delta);
        }

        internal const double DBL_EPSILON = 2.2204460492503131e-016; /* smallest such that 1.0+DBL_EPSILON != 1.0 */
    }

Benchmark result:

Method value Mean Error StdDev Median
TestGreaterThanZero -9 0.9318 ns 0.0119 ns 0.0111 ns 0.9294 ns
TestGreaterThanZero2 -9 0.0532 ns 0.0007 ns 0.0006 ns 0.0533 ns
TestGreaterThan -9 0.3235 ns 0.0009 ns 0.0008 ns 0.3234 ns
TestGreaterThanZero -8 1.1911 ns 0.0013 ns 0.0011 ns 1.1910 ns
TestGreaterThanZero2 -8 0.0545 ns 0.0047 ns 0.0044 ns 0.0543 ns
TestGreaterThan -8 0.3238 ns 0.0018 ns 0.0014 ns 0.3243 ns
TestGreaterThanZero -7 0.9355 ns 0.0030 ns 0.0025 ns 0.9348 ns
TestGreaterThanZero2 -7 0.0254 ns 0.0026 ns 0.0023 ns 0.0242 ns
TestGreaterThan -7 0.3236 ns 0.0044 ns 0.0041 ns 0.3225 ns
TestGreaterThanZero -6 0.9360 ns 0.0062 ns 0.0055 ns 0.9335 ns
TestGreaterThanZero2 -6 0.0267 ns 0.0029 ns 0.0027 ns 0.0263 ns
TestGreaterThan -6 0.3277 ns 0.0027 ns 0.0023 ns 0.3277 ns
TestGreaterThanZero -5 1.1729 ns 0.0008 ns 0.0008 ns 1.1728 ns
TestGreaterThanZero2 -5 0.0490 ns 0.0047 ns 0.0044 ns 0.0490 ns
TestGreaterThan -5 0.3580 ns 0.0084 ns 0.0078 ns 0.3540 ns
TestGreaterThanZero -4 0.9351 ns 0.0066 ns 0.0062 ns 0.9321 ns
TestGreaterThanZero2 -4 0.0207 ns 0.0014 ns 0.0012 ns 0.0201 ns
TestGreaterThan -4 0.3513 ns 0.0018 ns 0.0016 ns 0.3506 ns
TestGreaterThanZero -3 0.9332 ns 0.0027 ns 0.0024 ns 0.9336 ns
TestGreaterThanZero2 -3 0.0237 ns 0.0038 ns 0.0036 ns 0.0209 ns
TestGreaterThan -3 0.3594 ns 0.0093 ns 0.0087 ns 0.3547 ns
TestGreaterThanZero -2 0.9328 ns 0.0013 ns 0.0011 ns 0.9329 ns
TestGreaterThanZero2 -2 0.0227 ns 0.0043 ns 0.0040 ns 0.0216 ns
TestGreaterThan -2 0.3235 ns 0.0014 ns 0.0013 ns 0.3239 ns
TestGreaterThanZero -1 1.1961 ns 0.0042 ns 0.0035 ns 1.1945 ns
TestGreaterThanZero2 -1 0.0197 ns 0.0023 ns 0.0019 ns 0.0189 ns
TestGreaterThan -1 0.3632 ns 0.0083 ns 0.0078 ns 0.3639 ns
TestGreaterThanZero -0.9 1.1985 ns 0.0087 ns 0.0081 ns 1.1936 ns
TestGreaterThanZero2 -0.9 0.0214 ns 0.0006 ns 0.0005 ns 0.0212 ns
TestGreaterThan -0.9 0.3217 ns 0.0023 ns 0.0018 ns 0.3223 ns
TestGreaterThanZero -0.8 1.1755 ns 0.0013 ns 0.0012 ns 1.1753 ns
TestGreaterThanZero2 -0.8 0.0206 ns 0.0020 ns 0.0016 ns 0.0202 ns
TestGreaterThan -0.8 0.3255 ns 0.0012 ns 0.0010 ns 0.3257 ns
TestGreaterThanZero -0.7 0.9344 ns 0.0030 ns 0.0028 ns 0.9341 ns
TestGreaterThanZero2 -0.7 0.0208 ns 0.0003 ns 0.0003 ns 0.0208 ns
TestGreaterThan -0.7 0.3496 ns 0.0100 ns 0.0094 ns 0.3434 ns
TestGreaterThanZero -0.6 1.1930 ns 0.0006 ns 0.0005 ns 1.1930 ns
TestGreaterThanZero2 -0.6 0.2691 ns 0.0028 ns 0.0023 ns 0.2680 ns
TestGreaterThan -0.6 0.3226 ns 0.0011 ns 0.0008 ns 0.3224 ns
TestGreaterThanZero -0.5 1.1923 ns 0.0010 ns 0.0009 ns 1.1922 ns
TestGreaterThanZero2 -0.5 0.0244 ns 0.0047 ns 0.0044 ns 0.0213 ns
TestGreaterThan -0.5 0.3233 ns 0.0006 ns 0.0005 ns 0.3235 ns
TestGreaterThanZero -0.4 1.1930 ns 0.0009 ns 0.0009 ns 1.1931 ns
TestGreaterThanZero2 -0.4 0.0521 ns 0.0004 ns 0.0003 ns 0.0520 ns
TestGreaterThan -0.4 0.3263 ns 0.0039 ns 0.0037 ns 0.3239 ns
TestGreaterThanZero -0.3 1.1909 ns 0.0006 ns 0.0006 ns 1.1909 ns
TestGreaterThanZero2 -0.3 0.0208 ns 0.0004 ns 0.0003 ns 0.0208 ns
TestGreaterThan -0.3 0.3598 ns 0.0085 ns 0.0079 ns 0.3569 ns
TestGreaterThanZero -0.2 1.1907 ns 0.0012 ns 0.0011 ns 1.1907 ns
TestGreaterThanZero2 -0.2 0.0235 ns 0.0037 ns 0.0035 ns 0.0222 ns
TestGreaterThan -0.2 0.3216 ns 0.0031 ns 0.0024 ns 0.3220 ns
TestGreaterThanZero -0.1 0.9382 ns 0.0013 ns 0.0012 ns 0.9380 ns
TestGreaterThanZero2 -0.1 0.0585 ns 0.0045 ns 0.0042 ns 0.0586 ns
TestGreaterThan -0.1 0.3245 ns 0.0043 ns 0.0040 ns 0.3229 ns
TestGreaterThanZero -0 1.1968 ns 0.0091 ns 0.0085 ns 1.1922 ns
TestGreaterThanZero2 -0 0.0216 ns 0.0023 ns 0.0021 ns 0.0204 ns
TestGreaterThan -0 0.3223 ns 0.0024 ns 0.0021 ns 0.3230 ns
TestGreaterThanZero 0 0.9388 ns 0.0053 ns 0.0049 ns 0.9395 ns
TestGreaterThanZero 0 1.1986 ns 0.0079 ns 0.0074 ns 1.1950 ns
TestGreaterThanZero 0 0.9343 ns 0.0023 ns 0.0020 ns 0.9339 ns
TestGreaterThanZero2 0 0.0496 ns 0.0007 ns 0.0007 ns 0.0498 ns
TestGreaterThanZero2 0 0.0211 ns 0.0004 ns 0.0003 ns 0.0210 ns
TestGreaterThanZero2 0 0.0544 ns 0.0005 ns 0.0005 ns 0.0543 ns
TestGreaterThan 0 0.3203 ns 0.0043 ns 0.0040 ns 0.3188 ns
TestGreaterThan 0 0.3234 ns 0.0017 ns 0.0016 ns 0.3238 ns
TestGreaterThan 0 0.3603 ns 0.0094 ns 0.0088 ns 0.3547 ns
TestGreaterThanZero 0.1 1.2065 ns 0.0007 ns 0.0007 ns 1.2063 ns
TestGreaterThanZero2 0.1 0.0541 ns 0.0048 ns 0.0045 ns 0.0520 ns
TestGreaterThan 0.1 1.4155 ns 0.0002 ns 0.0002 ns 1.4155 ns
TestGreaterThanZero 0.2 0.8607 ns 0.0027 ns 0.0025 ns 0.8591 ns
TestGreaterThanZero2 0.2 0.0196 ns 0.0003 ns 0.0003 ns 0.0196 ns
TestGreaterThan 0.2 1.4148 ns 0.0003 ns 0.0002 ns 1.4149 ns
TestGreaterThanZero 0.3 0.8659 ns 0.0077 ns 0.0072 ns 0.8718 ns
TestGreaterThanZero2 0.3 0.0149 ns 0.0004 ns 0.0003 ns 0.0150 ns
TestGreaterThan 0.3 1.4310 ns 0.0051 ns 0.0048 ns 1.4300 ns
TestGreaterThanZero 0.4 1.2059 ns 0.0007 ns 0.0007 ns 1.2058 ns
TestGreaterThanZero2 0.4 0.0205 ns 0.0007 ns 0.0006 ns 0.0204 ns
TestGreaterThan 0.4 1.4206 ns 0.0084 ns 0.0078 ns 1.4153 ns
TestGreaterThanZero 0.5 1.2063 ns 0.0005 ns 0.0005 ns 1.2063 ns
TestGreaterThanZero2 0.5 0.0276 ns 0.0026 ns 0.0024 ns 0.0287 ns
TestGreaterThan 0.5 1.4356 ns 0.0154 ns 0.0144 ns 1.4271 ns
TestGreaterThanZero 0.6 0.8617 ns 0.0030 ns 0.0027 ns 0.8601 ns
TestGreaterThanZero2 0.6 0.0201 ns 0.0002 ns 0.0002 ns 0.0201 ns
TestGreaterThan 0.6 1.5681 ns 0.0101 ns 0.0089 ns 1.5683 ns
TestGreaterThanZero 0.7 0.8576 ns 0.0002 ns 0.0002 ns 0.8576 ns
TestGreaterThanZero2 0.7 0.0203 ns 0.0008 ns 0.0007 ns 0.0202 ns
TestGreaterThan 0.7 1.4342 ns 0.0079 ns 0.0074 ns 1.4312 ns
TestGreaterThanZero 0.8 0.8575 ns 0.0002 ns 0.0002 ns 0.8575 ns
TestGreaterThanZero2 0.8 0.0209 ns 0.0006 ns 0.0004 ns 0.0209 ns
TestGreaterThan 0.8 1.4131 ns 0.0003 ns 0.0002 ns 1.4130 ns
TestGreaterThanZero 0.9 1.2069 ns 0.0008 ns 0.0007 ns 1.2070 ns
TestGreaterThanZero2 0.9 0.0543 ns 0.0040 ns 0.0038 ns 0.0520 ns
TestGreaterThan 0.9 1.4338 ns 0.0065 ns 0.0057 ns 1.4348 ns
TestGreaterThanZero 1 1.2065 ns 0.0008 ns 0.0007 ns 1.2067 ns
TestGreaterThanZero2 1 0.0202 ns 0.0006 ns 0.0005 ns 0.0203 ns
TestGreaterThan 1 1.4234 ns 0.0094 ns 0.0088 ns 1.4305 ns
TestGreaterThanZero 2 0.8596 ns 0.0002 ns 0.0002 ns 0.8596 ns
TestGreaterThanZero2 2 0.0509 ns 0.0009 ns 0.0008 ns 0.0510 ns
TestGreaterThan 2 1.4342 ns 0.0070 ns 0.0062 ns 1.4339 ns
TestGreaterThanZero 3 0.8657 ns 0.0074 ns 0.0069 ns 0.8618 ns
TestGreaterThanZero2 3 0.0509 ns 0.0005 ns 0.0004 ns 0.0508 ns
TestGreaterThan 3 1.4128 ns 0.0003 ns 0.0002 ns 1.4127 ns
TestGreaterThanZero 4 1.2064 ns 0.0008 ns 0.0007 ns 1.2064 ns
TestGreaterThanZero2 4 0.0566 ns 0.0053 ns 0.0049 ns 0.0532 ns
TestGreaterThan 4 1.4147 ns 0.0002 ns 0.0002 ns 1.4147 ns
TestGreaterThanZero 5 1.2065 ns 0.0012 ns 0.0010 ns 1.2067 ns
TestGreaterThanZero2 5 0.0522 ns 0.0006 ns 0.0005 ns 0.0521 ns
TestGreaterThan 5 1.4157 ns 0.0006 ns 0.0005 ns 1.4157 ns
TestGreaterThanZero 6 0.8626 ns 0.0008 ns 0.0007 ns 0.8623 ns
TestGreaterThanZero2 6 0.0204 ns 0.0003 ns 0.0003 ns 0.0205 ns
TestGreaterThan 6 1.4123 ns 0.0002 ns 0.0001 ns 1.4123 ns
TestGreaterThanZero 7 0.8601 ns 0.0001 ns 0.0001 ns 0.8601 ns
TestGreaterThanZero2 7 0.0512 ns 0.0008 ns 0.0008 ns 0.0510 ns
TestGreaterThan 7 1.4280 ns 0.0056 ns 0.0044 ns 1.4269 ns
TestGreaterThanZero 8 0.8679 ns 0.0073 ns 0.0068 ns 0.8633 ns
TestGreaterThanZero2 8 0.0141 ns 0.0004 ns 0.0004 ns 0.0143 ns
TestGreaterThan 8 1.4137 ns 0.0003 ns 0.0002 ns 1.4137 ns
TestGreaterThanZero 9 1.2210 ns 0.0155 ns 0.0145 ns 1.2325 ns
TestGreaterThanZero2 9 0.0475 ns 0.0003 ns 0.0003 ns 0.0475 ns
TestGreaterThan 9 1.4136 ns 0.0003 ns 0.0003 ns 1.4136 ns

Customer Impact

No.

Regression

dotnet 7

Testing

Just CI.

Risk

Maybe I changed the bahavior.

@lindexi lindexi requested a review from a team as a code owner October 24, 2021 10:33
@ghost ghost added the PR metadata: Label to tag PRs, to facilitate with triage label Oct 24, 2021
@ghost ghost requested review from fabiant3, ryalanms and SamBent October 24, 2021 10:33
lindexi added a commit to lindexi/lindexi_gd that referenced this pull request Oct 24, 2021
@singhashish-wpf singhashish-wpf added the Performance Performance related issue label Oct 27, 2021
@pchaurasia14 pchaurasia14 added the Community Contribution A label for all community Contributions label Jul 20, 2022
@ghost ghost assigned lindexi Jul 20, 2022
@rchauhan18 rchauhan18 requested review from rchauhan18 and removed request for SamBent June 28, 2023 09:09
@dipeshmsft
Copy link
Member

Thanks @lindexi for your contribution.

@dipeshmsft dipeshmsft merged commit 6fc9dc6 into dotnet:main Jun 28, 2023
1 check passed
@lindexi
Copy link
Contributor Author

lindexi commented Jun 28, 2023

Thank you @dipeshmsft

@dotnet dotnet locked as resolved and limited conversation to collaborators Jul 28, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Community Contribution A label for all community Contributions Included in test pass Performance Performance related issue PR metadata: Label to tag PRs, to facilitate with triage
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants