Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Fleder
244 / 207 / 106
Регистрация: 09.12.2015
Сообщений: 630
#1

Скоростное округление чисел - C#

25.07.2017, 15:28. Просмотров 380. Ответов 9
Метки нет (Все метки)

Здравствуйте!

Есть деление целых чисел, но результат должен быть не усечён, а округлён.
Самое очевидное решение:
C#
1
2
3
int a = 1;
int b = 2;
int c = (int)Math.Round((double)a / (double)b, MidpointRounding.AwayFromZero);
Но оно не самое быстрое.
Как можно ускорить?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2017, 15:28
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Скоростное округление чисел (C#):

Округление чисел.
Привет всем) У меня есть вопрос, думаю наилегчайший. double n; n =...

Округление чисел
Всем привет, стоит такая задача.. У нас есть 3 числа, допустим 345 78 25 ...

Округление чисел
Добрый вечер,подскажите пожалуйста,как можно округлить число до ближайшего...

Округление чисел по правилу
Всем доброго времени суток, столкнулся с такой проблемой - Нужно округлить...

Округление чисел к большему значению
Добрый день, не могу округлить числа которые заканчиваются на 5 к большему вот...

Нежелательное округление чисел при делении
double x; x = 9/2; textBox1.Text = x.ToString(); В текстбокс выводится......

9
kolorotur
Эксперт .NET
9937 / 8323 / 2044
Регистрация: 17.09.2011
Сообщений: 14,325
25.07.2017, 15:37 #2
Цитата Сообщение от Fleder Посмотреть сообщение
Но оно не самое быстрое.
В сравнении с чем?
0
Fleder
244 / 207 / 106
Регистрация: 09.12.2015
Сообщений: 630
25.07.2017, 15:48  [ТС] #3
Цитата Сообщение от kolorotur Посмотреть сообщение
В сравнении с чем?
Ну, там всё-таки вызов функции и всё такое...
Вот и думаю, а можно ли без вызовов всяких функций добиться более скоростного решения?
Может есть какой-нибудь хитрый алгоритм?
0
kolorotur
Эксперт .NET
9937 / 8323 / 2044
Регистрация: 17.09.2011
Сообщений: 14,325
25.07.2017, 16:00 #4
Цитата Сообщение от Fleder Посмотреть сообщение
Ну, там всё-таки вызов функции и всё такое...
Наличие этого вызова убивает производительность настолько, что возникает необходимость его оптимизировать?

Цитата Сообщение от Fleder Посмотреть сообщение
а можно ли без вызовов всяких функций добиться более скоростного решения?
Ну посмотрите реализацию этого метода и вместо вызова везде вставляйте этот код.
Потом сравните производительность с вызовом метода. Стоило оно того?
0
Fleder
244 / 207 / 106
Регистрация: 09.12.2015
Сообщений: 630
25.07.2017, 16:11  [ТС] #5
Цитата Сообщение от kolorotur Посмотреть сообщение
Ну посмотрите реализацию этого метода и вместо вызова везде вставляйте этот код.
Везде вставлять этот аццкий код?!
Уж лучше к нему делегировать!
0
Fleder
244 / 207 / 106
Регистрация: 09.12.2015
Сообщений: 630
26.07.2017, 16:36  [ТС] #6
Здравствуйте!
Алгоритм целочисленного деления с округлением получился такого вида: c = (a * 2 / b + 1) / 2;
Вроде как это полный аналог этого: c = (int)Math.Round((double)a / (double)b, MidpointRounding.AwayFromZero);
Вот сравнительный тест:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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;
   }
}
0
Миниатюры
Скоростное округление чисел  
kolorotur
Эксперт .NET
9937 / 8323 / 2044
Регистрация: 17.09.2011
Сообщений: 14,325
26.07.2017, 21:09 #7
Цитата Сообщение от Fleder Посмотреть сообщение
Алгоритм целочисленного деления с округлением получился такого вида: c = (a * 2 / b + 1) / 2;
Формула округляет в сторону бесконечности, а не от нуля.
То есть аналог не полный.
0
Fleder
244 / 207 / 106
Регистрация: 09.12.2015
Сообщений: 630
26.07.2017, 21:20  [ТС] #8
Цитата Сообщение от kolorotur Посмотреть сообщение
Формула округляет в сторону бесконечности, а не от нуля.
То есть аналог не полный.
Вы имели в виду в сторону плюс бесконечности?
Так и есть. Но в моём случае числитель и знаменатель положительные.
Так что я схитрил.
0
EveKS
391 / 354 / 148
Регистрация: 19.04.2016
Сообщений: 1,429
Завершенные тесты: 7
27.07.2017, 08:09 #9
И то что результаты разные и каждый раз, для нового числа нужен свой велосипед, это не чего?
0
Fleder
244 / 207 / 106
Регистрация: 09.12.2015
Сообщений: 630
27.07.2017, 11:45  [ТС] #10
Цитата Сообщение от EveKS Посмотреть сообщение
И то что результаты разные и каждый раз, для нового числа нужен свой велосипед, это не чего?
Я использую для быстрого вычисления градиента цветов (и равномерного, потому как без округления получается "перекос" цветов).
Работа только с положительными числами (byte).
И результаты всегда одинаковые!
0
27.07.2017, 11:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2017, 11:45
Привет! Вот еще темы с решениями:

Округление float чисел до двух знаков после запятой
Всем привет! Возникла такая проблема: Необходимо округлить число типа float...

Округление
Здравствуйте, дурацкий вопрос, но не могу найти ответа. Есть числа,...

Округление в c#
Доброго времени. Проверяю работу калькулятора, но у калькулятора только семь...

Округление
Добрый вечер. Подскажите пожалуйста. Есть 2 textBoxa в 1й вводится трехзначное...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru