Ошибки, баги, вопросы - страница 3418

 
Slava #:

Неизвестно когда.

На матрицах целочисленного типа происходит катастрофическая потеря точности. Если речь идёт о машинном обучении, то матрицы весов по-любому должны быть вещественного типа, пусть даже и float. А на векторах слоёв вы много не выиграете.

Я понимаю, если бы был запрос на float16. Но, это всё - экономия на спичках

Реализация работы с матрицами в MQL5 - для меня в первую очередь это реализация динамичного двухмерного массива.

Машинное обучение - это не только создание моделей, но и подготовка данных и их анализ. Древовидные модели замечательно работают с целыми числами, в том числе после квантования.

Конкретно сейчас мне нужно анализировать модель, для чего требуется матрица примерно 70000 строк на 17000 столбцов, Данные в ней бинарные по сути - анализируется активация листьев.

Использую матрицы, а не одномерный массив, так как есть существенная экономия на подсчёте индексов массива.

Планирую расчет перенести на GPU - там ограничения по памяти ещё более критичны. Хочется передавать данные для работы с двухмерным массивом.

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

 
В (1) случае нет Предупреждения, а во (2) есть:
void f( ushort& ch )
{
    int i = 1;
    ch += 1; //(1)
    ch += i; //(2)//Warning: possible loss of data due to type conversion from 'int' to 'ushort'
}

А какая принципиальная разница между ними?

 
A100 #:
В (1) случае нет Предупреждения, а во (2) есть:

А какая принципиальная разница между ними?

Числовая константа не превосходит USHORT_MAX.

 
В (1) случае нет Предупреждения, а во (2) и (3) есть:
void OnStart()
{
    int i = 1;
    ushort ch = USHORT_MAX;
    ch = ch + 1; //(1)
    ch = ch + i; //(2)//possible loss of data due to type conversion from 'int' to 'ushort'
    ch =      i; //(3)//possible loss of data due to type conversion from 'int' to 'ushort'
}

А какая принципиальная разница между ними?

 
A100 #:
В (1) случае нет Предупреждения, а во (2) и (3) есть:

А какая принципиальная разница между ними?

там-же написано...серым по белым насерато выбеленно - возможна потеря данных при конверсии из знакового int (32/64 бита от архитектуры) и беззнакового ushort (16 бит как правило)

разные размерности и знаковость

 
Maxim Kuznetsov #:

там-же написано...серым по белым насерато выбеленно - возможна потеря данных при конверсии из знакового int (32/64 бита от архитектуры) и беззнакового ushort (16 бит как правило)

разные размерности и знаковость

А в (1) случае почему тогда невозможна?

 
A100 #:

А в (1) случае почему тогда невозможна?

Инта нет. Юшот + юшот = юшот. Нет приведения типов.
 
Sergey Gridnev #:
Инта нет. Юшот + юшот = юшот. Нет приведения типов.

Если нет, то почему тогда:

void OnStart()
{
    ushort ch = 0;
    Print(typename(ch + 1));
}

Результат: int а не ushort ?

 
A100 #:

Если нет, то почему тогда:

Результат: int а не ushort ?

А это уже странно.
 
Sergey Gridnev #:
А это уже странно.

Напротив - все строго по Документации:

"Перед выполнением операций (кроме операций присваивания) происходит преобразование в тип, имеющий наибольший приоритет, а перед операциями присваивания - в целевой тип"

void OnStart()
{
    ushort ch = 0;
    Print(typename(ch + 1)); //int(ushort) + int
}