Deutsch

Перегрузки методов для числовых параметров

163  
alex445 патриот4 дня назад, 13:23
4 дня назад, 13:23 
Последний раз изменено 4 дня назад, 13:23 (alex445)

Имеем скажем любой метод, который что-то считает по поступающим числам. Но применяет одинаковую формулу.


Все советуют делать для каждого нужного типа свою перегрузку. Но формулу-то что, каждый раз заново писать для всех перегрузок?


Менее распространённые советы - писать формулу лишь для варианта с double или decimal, а в остальных перегрузках вызывать один из первых вариантов с приведением типов параметров. Но ведь тут мы теряем в точности мантиссы? Плюём на это и смиряемся?

#1 
alex445 патриот4 дня назад, 14:12
NEW 4 дня назад, 14:12 
в ответ alex445 4 дня назад, 13:23, Последний раз изменено 4 дня назад, 14:15 (alex445)

Они просто повторяют формулы. И тесты похоже тоже пишут оданиковые под копирку, только с другими типами. Или у них этот код вообще по шаблону генерится, включая тесты.


Разве что этот атрибут добавляют, чтобы наверняка

[MethodImpl(MethodImplOptions.AggressiveInlining)]

#2 
AlexNek патриот4 дня назад, 17:38
AlexNek
NEW 4 дня назад, 17:38 
в ответ alex445 4 дня назад, 13:23
Но формулу-то что, каждый раз заново писать для всех перегрузок?
Ну генерик можно сделать
#3 
alex445 патриот4 дня назад, 19:16
NEW 4 дня назад, 19:16 
в ответ AlexNek 4 дня назад, 17:38

Нет нормальных генериков для чисел.

#4 
AlexNek патриот4 дня назад, 19:44
AlexNek
NEW 4 дня назад, 19:44 
в ответ alex445 4 дня назад, 19:16

А это чем не нравится?

using System.Numerics;

public static T AddNumbers<T>(T a, T b) where T : INumber<T>
{
    return a + b;
}

#5 
alex445 патриот4 дня назад, 19:48
NEW 4 дня назад, 19:48 
в ответ AlexNek 4 дня назад, 19:44, Последний раз изменено 4 дня назад, 19:57 (alex445)

Это новьё и не везде работает. Время пройдёт, тогда посмотрим.


И это не то, по-моему. Какая-то возня с функциями, вместо того, чтобы как раньше писать a + b / c * d - e.


Ещё раз гляньте мою ссылку - сами дотнетовцы в своих исходниках тупо копипастят код, который семантически выглядит одинаково, а внутри операторы для каждого типа переопределены.

#6 
AlexNek патриот4 дня назад, 20:11
AlexNek
NEW 4 дня назад, 20:11 
в ответ alex445 4 дня назад, 19:48

ну если .нет 7 новьё смущ По старому, тоже должно работать

public static T Add<T>(T a, T b)
{
    dynamic x = a;
    dynamic y = b;
    return x + y;
}

.

сами дотнетовцы

А кто мешает сделать тоже самое? Вариантов не так уж и много

#7 
Срыв покровов патриот4 дня назад, 21:29
NEW 4 дня назад, 21:29 
в ответ AlexNek 4 дня назад, 19:44

у меня ломается моск от вот этого

T : INumber<T>
#8 
AlexNek патриот4 дня назад, 21:51
AlexNek
NEW 4 дня назад, 21:51 
в ответ Срыв покровов 4 дня назад, 21:29

Так уж решили, тут этого дофига

https://learn.microsoft.com/en-us/dotnet/api/system.numeri...


А хотелось небось T: int ?

#9 
alex445 патриот4 дня назад, 23:05
NEW 4 дня назад, 23:05 
в ответ AlexNek 4 дня назад, 20:11
сами дотнетовцы

А кто мешает сделать тоже самое? Вариантов не так уж и много

По-моему эта фигня с пачками интерфейсов не для интенсивных вычислений придумана.

#10 
alex445 патриот4 дня назад, 23:10
NEW 4 дня назад, 23:10 
в ответ AlexNek 4 дня назад, 21:51
А хотелось небось T: int ?

Хотелось T: int, double, float

И писать T a = b + c * d / e;

Всё равно все эти действия для указанных чисел определены, так что один код для всех должен быть. Копипастить вручную или генерацией, а потом везде прописывать "интерсивный инлайнинг" - какой-то лютый костыль из-за несовершенства архитектуры языка. Хотя инлайнинг похоже по другой причине прописан, но копипастинг-то остаётся.

#11 
AlexNek патриот4 дня назад, 23:15
AlexNek
NEW 4 дня назад, 23:15 
в ответ alex445 4 дня назад, 23:05

А что мешает протестировать?

#12 
AlexNek патриот4 дня назад, 23:36
AlexNek
NEW 4 дня назад, 23:36 
в ответ alex445 4 дня назад, 23:05
| Method          | Mean       | Error    | StdDev   |
|---------------- |-----------:|---------:|---------:|
| AddNumbers      |   244.7 ns |  3.52 ns |  2.94 ns |
| AddInt          |   243.1 ns |  1.94 ns |  1.81 ns |
| SubtractNumbers |   243.1 ns |  2.98 ns |  2.79 ns |
| SubtractInt     |   250.6 ns |  5.00 ns |  7.93 ns |
| MultiplyNumbers |   249.3 ns |  5.00 ns |  7.18 ns |
| MultiplyInt     |   246.3 ns |  2.88 ns |  2.56 ns |
| DivideNumbers   | 1,910.2 ns | 22.21 ns | 20.77 ns |
| DivideInt       | 1,890.8 ns |  9.41 ns |  8.34 ns |
#13 
alex445 патриот3 дня назад, 00:46
NEW 3 дня назад, 00:46 
в ответ AlexNek 4 дня назад, 23:36

Это вы как такую табличку получили? Скопировали откуда-то?

#14 
alex445 патриот3 дня назад, 00:49
NEW 3 дня назад, 00:49 
в ответ Срыв покровов 4 дня назад, 21:29, Последний раз изменено 3 дня назад, 00:52 (alex445)
у меня ломается моск от вот этого


T : INumber<T>

Это много где встречается. Например


public abstract class PointerEventBase<T>
    where T : PointerEventBase<T>, new()

public sealed class ClickEvent : PointerEventBase<ClickEvent>
#15 
kukka местный житель3 дня назад, 03:30
kukka
NEW 3 дня назад, 03:30 
в ответ alex445 4 дня назад, 19:48

Найдите справочник по мате в Сингапуре, и можете визуализировать сколько угодно.

#16 
AlexNek патриот3 дня назад, 19:19
AlexNek
NEW 3 дня назад, 19:19 
в ответ alex445 3 дня назад, 00:46, Последний раз изменено 2 дня назад, 17:16 (AlexNek)
Это вы как такую табличку получили?

С пацанами правильными нужно дружить, а не кидаться по ним грязью спок

Могу проект выложить, если интересует.

Интересовала прежде всего грубая оценка производительности.

#17 
alex445 патриот3 дня назад, 19:30
NEW 3 дня назад, 19:30 
в ответ AlexNek 3 дня назад, 19:19

С пацанами правильными нужно дружить, а не кидаться по ним грязью спок

Могу проект выложить, если интересует.

Да не надо проект - достаточно вас, который делится тут инфой от "правильных пацаноф". )))

#18