Олександр
Но лучше все-таки дельту сравнивать
Ivan
Главное что правая часть всегда одинаковая
Ivan
Ну это понятно
Berkus
это не тот ноль
Berkus
это return value
Berkus
xorps xmm0, xmm0 вот fpu ноль
Олександр
Ну да, перепутал
Berkus
rax вообще для fp вычислений не используется
Berkus
там дальше для сравнения используется ucomisd
Berkus
у которого есть интересные оговорки
Berkus
and sets the ZF, PF, and CF flags in the EFLAGS register according to the result (unordered, greater than, less than, or equal). The OF, SF and AF flags in the EFLAGS register are set to 0. The unordered result is returned if either source operand is a NaN (QNaN or SNaN). The sign of zero is ignored for comparisons, so that –0.0 is equal to +0.0.
Олександр
http://cpp.sh/9zmjm
Berkus
https://godbolt.org/g/UjAC4v а вот с оптимизацией
Олександр
true)
Berkus
ну это проверка на одном компиляторе, на одной архитектуре
Berkus
так себе тест
Олександр
Berkus
лень тестировать все vfp архитектуры, neon, altivec.... буэ
Олександр
Литерал 0.0 это точно 0
Олександр
Ivan
Anatoly
единственная практическая польза от сравнения на равенство с 0.0 - это убедится, что число было инициализировано литералом 0.0
Ivan
))
Олександр
Нашел еще fpclassify ☺️
http://en.cppreference.com/w/cpp/numeric/math/fpclassify
Ivan
В текущей логике мне это и надо проверить
Berkus
Berkus
хехе
Anatoly
повезло :)
Berkus
смысле
Berkus
false же возвращает
Berkus
0.0 != 0.3 - 0.1 - 0.1 - 0.1
Олександр
ох уж эти оптимизации
Berkus
причем на уровне опимайзера false :)
Berkus
то есть ТОЧНО НЕ РАВНО
Олександр
Если бы это вычислялось в рантайм, результат не гарантирован
Berkus
ну оптимайзер посчитал что похуй пляшем, не равно
Anatoly
я так думаю оптимизатор свернул цикл и получил после 0.3 - 0.1 - 0.1 - 0.1 не 0.0
Anatoly
все логично
Олександр
Олександр
Ну вот оптимизатор и вычислил, значит)
Berkus
причем оптимизатор тут прав, т.к. действительно не равно
Anatoly
0.3 и 0.1 не представимо точно
Олександр
Оптимизатор же считает так же
Олександр
))
Anatoly
у него другой арифметики нет
Anatoly
а 1.5 - 0.5 - 0.5 - 0.5 вполне вернет литеральный 0.0
Anatoly
mov eax, 1
ret
Evgenii
Implementing Algebraic Effects in C https://www.microsoft.com/en-us/research/publication/implementing-algebraic-effects-c/#
Anatoly
спасибо, разъяснил :)
Александр
https://habrahabr.ru/company/infopulse/blog/334284/
Александр
перевод
Александр
нет, даже не перевод, а своё что-то
Berkus
Александр
Александр
Александр
плюс, если метакомпилер поддерживает атрибуты, то на них можно навешать логики
Александр
туда же:
"Мы сможем реализовывать на этапе компиляции даже такие сложные проверки, как «во всех ли методах класса, обращающихся к некоторой переменной мы используем критическую секцию, контролирующую доступ к ней?»"
Nikolay
Народ, кто работал с libclang?
Есть два вопроса.
Как заставить его парсить файл как сишный?
Можно ли через clang-овское сишное api модифицировать исходник, с которым работаешь?
Nikolay
Я пробовал писать ему в аргументы к clang_parseTranslationUnit "-c", но должного эффекта это не возымело.
cyberzx 🇷🇺
Nikolay
cyberzx 🇷🇺
Как ты вообще можешь менять исходники? Я не нашёл там никаких генераторов
Nikolay
Я в примерах видел нечто, типа Rewriter.
Nikolay
https://github.com/loarabia/Clang-tutorial/blob/master/CIrewriter.cpp
cyberzx 🇷🇺
интересная штука, надо бы попробовать
cyberzx 🇷🇺
а почему ты думаешь, что с С не заработает?
Nikolay
Это плюсовое апи. Аналог в сишном я не нашёл, второй вопрос был как раз об этом.
Arseny
Почему с++ нельзя делать так:
using container = std::vector;
и
using create = std::make_unique;
?
Vladislav
Arseny
Да. И про то, что нельзя сделать using для функции.
Vladislav
а
Vladislav
хороший вопрос
Vladislav
можно запилить пропозал) не думаю что есть какие-то принципиальные ограничения
Nik
Nik
а) теперь надо знать этот мета-язык, который уже отдаляется от С++;
б) любой библиотеко-писатель сможет под себя таких правил наворотить, что знание всех деталей стандарта собственно языка С++ уже не поможет разобраться, что же делает (и даже что означает) этот код.