Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
икс один – это половина делённого на а вычитания бэ из корня квадратного из разности квадрата бэ и четырех умноженного на а умноженного на цэ
икс два – это половина делённого на а арифметического отрицания суммы бэ и корня квадратного из разности квадрата бэ и четырех умноженного на а умноженного на цэ
Я же написал: модульность. Слово "using", которое вытаскивает определения функций из скомпилированных модулей.
C++ использует костыль, доставшийся от Си: препроцессор по каждому упоминанию #include включает в твой исходник куски чьих то чужих исходников с определениями функций и компилирует эти определения по миллиону раз. Precompiled headers -- это кэш для такой компиляции, но всё равно это костыль.
using открывает namespace, верно?
ну вот в С++ тоже есть namespaces.
>> #include
Вот, это уже ближе к телу: C# умеет дергать структуры из .dll (как и java из .class) а C++ делать этого не умеет.
Так что если ты написал полезную библиотеку "libpituh" и решил ее мне отдать, то в случае c# мне хватит pituh.dll, в случае java pituh.jar (с одним файлом pituh.class), а в случае C++ мне нужны pithuh.h и (в зависимости от копелятора и способа линковки) .so, .lib или .a.
Правильно-ли я понимаю что если бы .h мне был не нужен, то можно было бы сказать что у С++ есть модульность?
Суть модульности в том, что когда ты "инклудишь" модуль, тебе в область видимости не протекают автоматически все его зависимости, как это сейчас происходит с заголовочными файлами в с++. Это самая главная фича. А сколько там файлов в модуле и как он оптимизирован-кеширован - это детали реализации.
Нет. В С++ когда ты инклудишь <fmt/format.h> (*), тебе автоматически становятся доступны std::string, std::sort, std::sqrt и все остальное добро, которое инклудится в этом заголовочном файле. В языках с модулями это работает не так.
Namespaces используются только в новых фреймворках, а фреймворки не нужны. На "PHP" можно писать, как тебе нравится, в отличие от "Java", которая заставляет использовать ненужное ООП.
Кста, на джаве легко можно написать неподдерживаемый код с шестью уровнями наследования, каждый из которых добавляет восемь методов и переписывает три из предыдущих
Терпеть не могу это говно - надо написать функцию "__autoload" под свою структуру проекта, в код привносится некоторая неясность... Куда проще прописать "include".
Именно поэтому плюсы должны быть первым языком, чтобы ньюфаги понимали куда попали. Что программирование - это не "алгоритмы", "прикладная математика" и "архитектура", а фигурное ковыряние в говне.
Ну да, где-то читал такое... Мол программирование - это просто, надо просто быть не брезгливым и внимательным? А напишите хотя бы решение квадратного уравнения. Элементарная школьная задача. Формулу, небось, еще помните. Ну, предположим, что вы, конечно же, не забыли проверить знак дискриминанта. А то, что a может быть равно 0? А b? Надеюсь, вы не сравниваете флоаты с помощью "==". Но как вы выбрали порог? 0.000001 достаточно или много? А вдруг у нас все коэффициенты такого порядка? Это к дискриминанту тоже может относиться, кстати. И вот еще: вот мы вычитаем b2-4ac. А если эти значения большие, но близкие? Какая будет погрешность разницы? Да и вообще, какая погрешность результата, оценили?
> Но как вы выбрали порог? 0.000001 достаточно или много? А вдруг у нас все коэффициенты такого порядка?
Я давно думал над этим. Допустим, нужно 8 знаков мантиссы после запятой. Напишем так:
abs(a - b) < 1e-8 * max(abs(a), abs(b))
А вдруг у нас a и b настолько маленькие, что порядок 1e-8 * abs(a) выйдет за допустимые для типа пределы и случится underflow, т. е. фактически получится ноль?
А на каком отрезке будешь искать (если бинарный поиск)? Какое стартовое значение брать (если метод Ньютона)? Когда останавливаться? А вдруг метод Ньютона зациклится?
А это имеет значение? Бери любое. Нуль возьми. Второй корень из формулы Виета посчитаешь.
> А вдруг метод Ньютона зациклится?
Ну в теории метод ньютона УДВАИВАЕТ число правильных знаков на каждой итерации. Поэтому поставь лимит на число итераций (log_2 64 + 1, ну или 64 для верности), и будет тебе счастье.
Потому что cходящиеся итеративные процессы зачастую дают более точные результаты, чем маленькие и няшные, но неустойчивые, формулы.
Впрочем, тут я не иксперт, из своего опыта численных методов я понял только то, что это чёрная магия, и надо пользоваться только проверенными заклинаниями.
> cout << "Получилось выражение:\n" <<a<<"x^2+"<<b<<"x+"<< c <<"=0"<<endl;
Почуму плюсовички так любят cout? Ведь printf со своей строкой формата гораздо красивше и удобне.
(b*b)-4*a*c
# X1 = (-b + abs(b*b))/2*a;
X1 = (-b + sqrt((b*b)-4*a*c))/2*a;
# X2 = (-b - abs(b*b))/2*a;
X2 = (-b - sqrt((b*b)-4*a*c))/2*a;
X1 = (-b + sqrt((b*b)-4*a*c))/(2*a);
или
X1 = (-b + sqrt((b*b)-4*a*c))/2/a;
fixed
икс два – это половина делённого на а арифметического отрицания суммы бэ и корня квадратного из разности квадрата бэ и четырех умноженного на а умноженного на цэ
только чур говорите про мейнстримы, про такие на которые можно за доширак писать
Модульность есть в Java, в C#, в Delphi.
C++ использует костыль, доставшийся от Си: препроцессор по каждому упоминанию #include включает в твой исходник куски чьих то чужих исходников с определениями функций и компилирует эти определения по миллиону раз. Precompiled headers -- это кэш для такой компиляции, но всё равно это костыль.
ну вот в С++ тоже есть namespaces.
>> #include
Вот, это уже ближе к телу: C# умеет дергать структуры из .dll (как и java из .class) а C++ делать этого не умеет.
Так что если ты написал полезную библиотеку "libpituh" и решил ее мне отдать, то в случае c# мне хватит pituh.dll, в случае java pituh.jar (с одним файлом pituh.class), а в случае C++ мне нужны pithuh.h и (в зависимости от копелятора и способа линковки) .so, .lib или .a.
Правильно-ли я понимаю что если бы .h мне был не нужен, то можно было бы сказать что у С++ есть модульность?
В таком случае и в С++ при использовании неймспейсов этого не просиходит, нет?
* Речь в моем примере вот об этой библиотеке https://github.com/fmtlib/fmt/blob/master/include/fmt/format.h
Однако под своими namespaces, правильно?
То есть проблема в том, что ты становишься счастливым обладателем того говна что наинклудилось в .h. Это действительно плохо.
Говен, ты их используешь?
Но быдло считает, что это плохо и что влажная "Java" дисциплинирует.
Чел открыл нестандартный метод решения уравнений, а ты ему про какую-то школьную хуйню.
https://ideone.com/oP27PP
В Бейсике тоже был отдельный оператор (\ вместо /).
Так потеря точности будет меньше, ведь теперь перед вычитанием мы не возводим уменьшаемое и вычитаемое в квадрат? Или будет та же фигня?
Я давно думал над этим. Допустим, нужно 8 знаков мантиссы после запятой. Напишем так:
А вдруг у нас a и b настолько маленькие, что порядок 1e-8 * abs(a) выйдет за допустимые для типа пределы и случится underflow, т. е. фактически получится ноль?
А это имеет значение? Бери любое. Нуль возьми. Второй корень из формулы Виета посчитаешь.
> А вдруг метод Ньютона зациклится?
Ну в теории метод ньютона УДВАИВАЕТ число правильных знаков на каждой итерации. Поэтому поставь лимит на число итераций (log_2 64 + 1, ну или 64 для верности), и будет тебе счастье.
А если у меня уравнение x² - 16 = 0? Взял нуль — а там касательная горизонтальна, получил бесконечность, кровь-кишки.
Программист не обязан знать математику
Впрочем, тут я не иксперт, из своего опыта численных методов я понял только то, что это чёрная магия, и надо пользоваться только проверенными заклинаниями.
Почуму плюсовички так любят cout? Ведь printf со своей строкой формата гораздо красивше и удобне.
З.Ы. Но все эти std::hex << std::setw(10) << std::setfill('0') << x действительно выглядят по-уебански.