172 похожих чатов

Я почему-то считал, что современные компиляторы умеют хорошо оптимизировать математические

выражения. Например в таком выражении:
9.0 * x.powi(3) - 15.0 * x.powi(2)
достаточно выполнить 4 умножения:
x2 = x * x;
x3 = x2 * x;
9.0 * x3 - 15.0 * x2
Но я удивился когда увидел, что в Rust это выполняется в 5 умножений - он куб и квадрат от x считает независимо.
Это компилятор пока не дорос, или тут есть какие-то подводные камни из-за которых выбирается такое не оптимальное решение?

10 ответов

6 просмотров

Может, что-то с IEEE 754? Я не уверен, что должно получиться, если x2 это Infinity или NaN, например. Или просто недостаточно умный компилятор, да.

Я думаю, что это проблема (или не проблема) ллвм, а не раста

Можно вручную записать куб и квадрат через умножения и посмотреть, изменится ли сгенерированный код. Может тут именно вызов powi все ломает

https://godbolt.org/z/zn496h Вообще я вижу 4 умножения в обоих случаях

Kirill-Kuzminykh Автор вопроса
Emmanuel Goldstein
https://godbolt.org/z/zn496h Вообще я вижу 4 умнож...

Хм, на самом деле у меня сама функция немного сложнее. Указанное выражение вычисляется внутри неё в одной из веток if-else. Но я сейчас проверю ваш вариант

Kirill-Kuzminykh Автор вопроса
Emmanuel Goldstein
https://godbolt.org/z/zn496h Вообще я вижу 4 умнож...

Ага, у меня вот такой вариант даёт 5 умножений без ручной "оптимизации": pub fn calc(x: f32) -> f32 { let a = x.abs(); 9.0 * a.powi(3) - 15.0 * a.powi(2) } Если убрать .abs() то будет 4 умножения

плюсую догадки, что вопрос в семантике флоатов. скорее всего, ты хочешь аналог -ffast-math https://github.com/rust-lang/rust/issues/21690

Потому что в флоатах результат может отличаться, кроме случаев когда переменая одна

Похожие вопросы

Обсуждают сегодня

@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Подобного рода ;Следующие три строки это директивы ассемблера, ;которые можно не задавать, т.к.работаем в Visual Studio. ;Символ ";" - это начало однострочного комментария ...
Егор Анелькин
3
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
еще вопрос, допустим мы создадим char массив из 10 элементов и присвоим ему через сканф 10 символов. и выведем все символы. Хотел спросить последний элемент /0 будет включать...
Anthem
11
открыть папку в проводнике: 1 - ShellExecute 2 - ExecuteProcess 3 - OpenDocument что лучше выбрать?
Alexey Kulakov
12
Изменение типа с SomeException на String и правда удобней @cheese_hs . А вот такой вариант насколько некрасив еще? loadConfigDB :: IO (Either String ConfigDataBase) loadConfi...
Camara
7
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
Карта сайта