Особенности языка mql5, тонкости и приёмы работы - страница 312

 
fxsaber #:
Подскажите, пожалуйста, почему в одном случае возникает ошибка, а в другом - нет.
Потому что A возвращает значение double, а вы не можете присвоить значение r-значению.

B возвращает MqlStruct, и вы вызываете на нем operator=, который, в свою очередь, является функцией от MqlStruct.
 
Dominik Egert #:
Потому что A возвращает значение double, а вы не можете присвоить значение r-значению.

B возвращает MqlStruct, и вы вызываете на нем operator=, который, в свою очередь, является функцией от MqlStruct.

Спасибо!

 

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

uint Div1000( const uint Value ) { return((Value >> 10) + (Value >> 16) + (Value >> 17)); }
constdivmul
  • www.golovchenko.org
Background Source Code and Builds
 

Я только что просмотрел это, и это уже называется"сдвиг и сложение".

Для определенных множителей, таких как умножение на 10, результат будет точным.

 (x << 3) + (x << 1) # Здесь 10*x вычисляется как x*2^3 + x*2

https://www.wikiwand.com/en/articles/Multiplication_algorithm#Usage_in_computers

В основании два длинное умножение иногда называют "сдвиг и сложение", потому что алгоритм упрощается и состоит только из сдвига влево (умножение на степень двойки) и сложения.

Multiplication algorithm - Wikiwand
  • www.wikiwand.com
A multiplication algorithm is an algorithm to multiply two numbers. Depending on the size of the numbers, different algorithms are more efficient than others. N...
 
amrali #:

Я только что просмотрел это, и это уже называется"сдвинуть и добавить".

Для некоторых множителей, например умножения на 10, результат будет точным.

https://www.wikiwand.com/en/articles/Multiplication_algorithm#Usage_in_computers

В основании два длинное умножение иногда называют "сдвигом и сложением", потому что алгоритм упрощается и состоит только из сдвига влево (умножение на степень двойки) и сложения.


Разве процессоры, лежащие в основе архитектуры, не реализуют такие техники аппаратно?

Возможно, для этого потребуется провести бенчмаркинг.
 
Этот метод дает приближенные результаты для умножения с константой времени компиляции (на базовом оборудовании). В настоящее время компиляторы используют более продвинутые оптимизации для точных умножений, см. https://www.wikiwand.com/en/articles/Division_algorithm#Division_by_a_constant
.
Также здесь:

https://www.mql5.com/en/forum/393227/page280#comment_55325243

Существует также библиотека, оптимизирующая целочисленное деление с помощью констант времени компиляции, см. https://libdivide.com/.

Она, по сути, преобразует делитель в приблизительный множитель:

fast_d = libdivide_s32_gen( divisor);

 
Тест AVX512
Тест AVX512
  • 2025.09.19
  • www.mql5.com
Требуются добровольцы с avx512 Нужно скомпилировать и запустить скрипт в 4 режимах Поделиться результатами Дефолтные значения оптимальные можно SIZ...
 
 
О многократной смене:


Примерно на 34-й минуте.

Компиляторы действительно применяют этот метод, если могут.
 

Минимальная реализация алгоритма fastdiv (описана здесь https://www.wikiwand.com/en/articles/Division_algorithm?ai=topQs#Division_by_a_constant).

Это демонстрирует, как компилятор может оптимизировать деление на константу времени компиляции (до умножения и сдвига).

Compiler Version: 5283, X64 Regular
13 th Gen Intel Core i3-1305 U, AVX2 + FMA3
 2.48 ns/call, checksum = 516274437   // div_test
 0.53 ns/call, checksum = 516274437   // fastdiv_test
NB: эта оптимизация fastdiv не может быть применена для делителей, которые не известны во время компиляции (например, деление на переменную времени выполнения).
Файлы:
fastdiv.mq5  8 kb