Скоростное округление чисел - C#
Формулировка задачи:
Здравствуйте!
Есть деление целых чисел, но результат должен быть не усечён, а округлён.
Самое очевидное решение:
Но оно не самое быстрое.
Как можно ускорить?
int a = 1; int b = 2; int c = (int)Math.Round((double)a / (double)b, MidpointRounding.AwayFromZero);
Решение задачи: «Скоростное округление чисел»
textual
Листинг программы
using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;
namespace Test
{
class Program
{
static void Main(string[] args)
{
long pass = 1000000000;
int a = GetA();
int b = GetB();
int c = 0;
Stopwatch sw1 = Stopwatch.StartNew();
for(long i = 0; i < pass; ++i)
{
c = (a * 2 / b + 1) / 2;
}
sw1.Stop();
Stopwatch sw2 = Stopwatch.StartNew();
for(long i = 0; i < pass; ++i)
{
c = (int)Math.Round((double)a / (double)b, MidpointRounding.AwayFromZero);
}
sw2.Stop();
Console.WriteLine($"зайчик: {sw1.Elapsed}");
Console.WriteLine($"черепашка: {sw2.Elapsed}");
Console.ReadKey();
GC.KeepAlive(c);
}
[MethodImpl(MethodImplOptions.NoInlining)]
private static int GetA() => 500;
[MethodImpl(MethodImplOptions.NoInlining)]
private static int GetB() => 1000;
}
}