Member
Статус: Не в сети Регистрация: 12.09.2010 Откуда: Калининград
Proton1927 писал(а):
класс инкапсулирует весь вышеописанный геморрой с комплексными числами
Уж больно хитро - использовать классы для простейшей задачки( я уверен что вся сложность тут только в математике ), тем более что сверху код - чистый Си. complex.h? Слышал несколько раз про эту библиотеку, но ни разу не юзал. Потом посмотрим что получится и нужна ли она вообще тут
Member
Статус: Не в сети Регистрация: 12.09.2010 Откуда: Калининград
Proton1927 писал(а):
у меня нет просто С у меня Visual C++
Свойства проекта -> Свойства конфигурации -> С/С++ -> Компилировать как С. И можно писать на ANSI C Причём Visual Studio поддерживает бородатый стандарт, std89 В любом случае я как освобожусь посмотрю, как я понимаю не горит
Member
Статус: Не в сети Регистрация: 12.09.2010 Откуда: Калининград
Вобщем я немного посидел и вот что у меня получилось. Использование complex.h отпадает т.к. его поддержка появилась только в Си стандарта std99. Я не читал пока что про тонкости работы с комплексными числами - просто посмотрел готовые решения чтобы понять алгоритм. Генерируются такие же ответы что я видел в паре решений, но если я что и помню из курса высшей математики, что решение уравнений с отрицательным дискриминантом имело Гораздо больше тонкостей чем удачно i подставить. Для уравнения x^2+x+2=0 выдаётся результат -0.5 +/- 1.32288 * i - в тех решениях что я видел дальше не упрощают, я итак посчитал дальше чем в примерах что я видел и не уверен что препода устроят посчитанные √3 / 2 и прочие подобные действия. Вобщем вот код. Потом будет время почитаю поподробнее - уверен, появится повод что-то поменять
А разве вообще хорошая практика делать такие проверки? То есть цикл не запустится если количество 0 и это корректный код без проверки, а если количество не 0 и workers равен NULL то это дикий феил с вызывающей функцию стороны - можно разве что сделать debug assert. В любом случае если при каком-то некорректном аргументе нужно выйти из функции, я бы не делал if с гигантским телом, а написал бы
Передать в функцию могут все что угодно, поэтому практически везде запиливаю проверки на null. assert делать не удобно - в аварийной ситуации программа крешится, а хотелось бы продолжить работу. В общем случае 100% верного методоа нет.
Цитата:
Опять же, не знаю как там с точки зрения промышленного программирования или типа того, но занулять везде переменные даже где это никому не нужно - это никому не нужно. Зачем это вообще может быть нужно?
good practice
Цитата:
int hiredate должна идти первой чтобы сразу два члена попали в первые 128 байт структуры - это оптимальнее в общем случае, в любом случае вот тут это точно хорошая практика
А какая разница?
Цитата:
Будет быстрее работать в большинстве случаев если workers почти что никогда не равен NULL - статический branch predicator даже в случае отсутствия поддержки со стороны динамического отлично отработает это ветвление. Но код будет на пару байт тяжелее
Member
Статус: Не в сети Регистрация: 12.09.2010 Откуда: Калининград
Delin писал(а):
А какая разница?
В данном случае никакой, а вообще при доступе через указитель на структуру или через метод класса для доступа к первым 128 байтам данных достаточно использовать 1-байтовый оффсет. Для доступа к расположенным на удалении более чем 128 байт нужен уже как минимум 2-х байтный оффсет. Размер кода получается компактнее, на производительность напрямую не влияет, но больший размер кода ухудшает кэширование - а это уже может её понизить
Delin писал(а):
good practice
Может быть это можно назвать просто стилем, но в критичных к производительности частях программы так точно делать не стоит
Delin писал(а):
Передать в функцию могут все что угодно, поэтому практически везде запиливаю проверки на null. assert делать не удобно - в аварийной ситуации программа крешится, а хотелось бы продолжить работу. В общем случае 100% верного методоа нет
См. пункт выше
Delin писал(а):
А я думал до new/delete кто-нить докопается
А я не заметил к чему там прикапываться - использовать alloca и стэк вообще в таких случаях это весьма спорный момент и нужно отталкиваться от самого проекта, фиксированный размер тем более. Остаётся единственное универсальное решение когда другие не подходят - юзать кучу
Delin писал(а):
Да ладно? И работает?
Кстати да, я это проморгал - нужно было исправить. Вряд ли это работает - я даже не протестил
Может быть это можно назвать просто стилем, но в критичных к производительности частях программы так точно делать не стоит
Так это и не ботлнек, чтоб там все оптимайзить. Не спорю, есть участки кода, которые выполняются постоянно и их нужно качественно оптимизировать, зачастую в ущерб читаемости и поддержке. Оптимизировать участок кода, который выполняется пару раз - смысла нет. С проверками немного другая специфика, но они тоже нужны, в разумных пределах.
new/delete - код должен быть в С style, а тут вставочка из "плюсов".
Member
Статус: Не в сети Регистрация: 12.09.2010 Откуда: Калининград
Delin писал(а):
Так это и не ботлнек, чтоб там все оптимайзить. Не спорю, есть участки кода, которые выполняются постоянно и их нужно качественно оптимизировать, зачастую в ущерб читаемости и поддержке. Оптимизировать участок кода, который выполняется пару раз - смысла нет. С проверками немного другая специфика, но они тоже нужны, в разумных пределах
Ну это не оптимизация, это именно стиль. Если я вижу переменную int var; то сразу видно что она получает своё значение ниже. По мне так это удобно. И да, надо проверить, но скорее всего компилятор выкинет это зануление из конечного кода и не будет вообще никакой разницы как писать
Delin писал(а):
new/delete - код должен быть в С style, а тут вставочка из "плюсов"
Да там вообще-то ещё Visual C++ _tmain, установка Visual C++ дебаг флагов - этого даже в простом С++ нету
Добавлено спустя 10 минут 55 секунд: Нет, Visual Studio зануление не выкидывает - значит у неё нету нативной поддержки Си io, в отличие от функций типа memset. Таким образом зануляя получаем лишнюю инструкцию, в моём тесте простое зануление int a = 0; привело к росту кода на 8 байт по сравнению с просто int a;. Сама инструкция выполняется на современных процессорах за 1 такт, а вот на каком-нибудь Pentium 4 уже за 3
Добавлено спустя 3 световых года: P.S. занулять переменные вещественного типа ещё дороже
Member
Статус: Не в сети Регистрация: 12.09.2010 Откуда: Калининград
AZZOT писал(а):
препод сказал ошибка в операторах if
Всё правильно препод сказал, я просто на if не обратил внимания прошлый раз #define EPSILON 2.22045e-016
и потом в ифах
if( D <= EPSILON && D >= -EPSILON ) { } else if( D > EPSILON ) { } else if( D < -EPSILON ) { }
Применение оператора == к вещественным числам в большинстве случаев является ошибкой из-за наличия погрешности вычислений. Сравнивать необходимо через эпсилон
Добавлено спустя 4 минуты 24 секунды: И да, почему в первом ифе потерялся 1 знак равенства и теперь выполяется присвоение? Раньше и то корректнее было
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения