Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 629 • Страница 31 из 32<  1 ... 28  29  30  31  32  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
Proton1927 писал(а):
класс инкапсулирует весь вышеописанный геморрой с комплексными числами

Уж больно хитро - использовать классы для простейшей задачки( я уверен что вся сложность тут только в математике ), тем более что сверху код - чистый Си. complex.h? Слышал несколько раз про эту библиотеку, но ни разу не юзал. Потом посмотрим что получится и нужна ли она вообще тут



Партнер
 

Junior
Статус: Не в сети
Регистрация: 27.12.2010
по приколу было попробовать :)

Код:
// ComplexTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <complex>
#include <iostream>
#include <conio.h>


int _tmain(int argc, _TCHAR* argv[])
{
   using namespace std;

   complex<double> a, b, c, sqrtD, x1, x2;

   double re, im;
   cout << "Enter reA, imA: ";
   cin >> re >> im;
   a = complex<double>(re, im);
   cout << "Enter reB, imB: ";
   cin >> re >> im;
   b = complex<double>(re, im);
   cout << "Enter reC, imC: ";
   cin >> re >> im;
   c = complex<double>(re, im);

   sqrtD = sqrt(b * b - complex<double>(4, 0) * a * c);

   x1 = (-b + sqrtD) / (complex<double>(2, 0) * a);
   x2 = (-b - sqrtD) / (complex<double>(2, 0) * a);

   cout << "\n\nx1 = " << x1 << ";\nx2 = " << x2;

   cout << "\n\nTest: a * x * x + b * x + c = 0\n\n";

   cout << "x1: Result = " << a * x1 * x1 + b * x1 + c << endl;
   cout << "x2: Result = " << a * x2 * x2 + b * x2 + c << endl;

   _getch();

   return 0;
}


 

Member
Статус: Не в сети
Регистрация: 15.04.2007
Откуда: Челябинск №9180
все бы хорошо, только это надо на просто С :oops:
и еще как я понял тут надо вводить действительную и мнимую часть свободных переменных?


 

Junior
Статус: Не в сети
Регистрация: 27.12.2010
у меня нет просто С
у меня Visual C++


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
Proton1927 писал(а):
у меня нет просто С у меня Visual C++

Свойства проекта -> Свойства конфигурации -> С/С++ -> Компилировать как С. И можно писать на ANSI C
Причём Visual Studio поддерживает бородатый стандарт, std89
В любом случае я как освобожусь посмотрю, как я понимаю не горит


 

Junior
Статус: Не в сети
Регистрация: 27.12.2010
Industrialice не надо понимать так буквально


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
Proton1927 писал(а):
не надо понимать так буквально

Ок, my bad


 

Member
Статус: Не в сети
Регистрация: 15.04.2007
Откуда: Челябинск №9180
Proton1927 писал(а):
у меня нет просто С

http://yadi.sk/d/yLR3U6Blr6Zi


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
AZZOT имелось ввиду видно что нету кода на С. Turbo C? Я думал он в прошлом тысячелетии остался


 

Member
Статус: Не в сети
Регистрация: 15.04.2007
Откуда: Челябинск №9180
Industrialice писал(а):
AZZOT имелось ввиду видно что нету кода на С. Turbo C? Я думал он в прошлом тысячелетии остался

да, как-бы мне это надо еще сдать, препод из прошлого тысячилетия....


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
AZZOT писал(а):
да, как-бы мне это надо еще сдать, препод из прошлого тысячилетия....

Челябинские преподы суровы, но вообще-то везде так. Думаю если я к 7 утра сгенерирую Си код нормальный, это будет ок?


 

Member
Статус: Не в сети
Регистрация: 15.04.2007
Откуда: Челябинск №9180
Industrialice писал(а):
это будет ок

это будет очень ок ;)


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
Вобщем я немного посидел и вот что у меня получилось. Использование complex.h отпадает т.к. его поддержка появилась только в Си стандарта std99. Я не читал пока что про тонкости работы с комплексными числами - просто посмотрел готовые решения чтобы понять алгоритм. Генерируются такие же ответы что я видел в паре решений, но если я что и помню из курса высшей математики, что решение уравнений с отрицательным дискриминантом имело Гораздо больше тонкостей чем удачно i подставить. Для уравнения x^2+x+2=0 выдаётся результат -0.5 +/- 1.32288 * i - в тех решениях что я видел дальше не упрощают, я итак посчитал дальше чем в примерах что я видел и не уверен что препода устроят посчитанные √3 / 2 и прочие подобные действия. Вобщем вот код. Потом будет время почитаю поподробнее - уверен, появится повод что-то поменять

Код:
#include <stdio.h>
#include <math.h>
#include <conio.h>

int main()
{
double a,b,c,x1,x2,D,y;
printf("Vedite a,b,c ");
scanf("%lf,%lf,%lf",&a,&b,&c);
D=b*b-4*a*c;
if(D==0)
{
 x1=(-b)/(2*a);
 printf("\nOtvet x=%lf",x1);
 y=a*x1*x1+b*x1+c;
 printf("\nProverka proshla uspeshno y=%lf",y);
}
else if (D>0)
  {
   x1=(-b+sqrt(D))/(2*a);
   x2=(-b-sqrt(D))/(2*a);
   printf("\nOtvet x1=%lg i x2=%lg",x1,x2);
   y=a*x1*x1+b*x1+c;
   printf("\nPervii koren' y=%lg",y);
   y=a*x2*x2+b*x2+c;
   printf("\nVtoroi koren' y=%lg",y);
  }
 else if (D<0)
   {
   printf ("\nKorni kompleksnie");
   D=-D;
   printf( "\nx1 = %lg + %lg * i", -b / (2 * a), sqrt( D ) / (2 * a) );
   printf( "\nx2 = %lg - %lg * i", -b / (2 * a), sqrt( D ) / (2 * a) );
   }
getche();

return 0;
}


 

Member
Статус: Не в сети
Регистрация: 15.04.2007
Откуда: Челябинск №9180
спасибо пошёл сдаваться :-)


 

Member
Статус: Не в сети
Регистрация: 17.10.2005
Industrialice
Цитата:
А разве вообще хорошая практика делать такие проверки? То есть цикл не запустится если количество 0 и это корректный код без проверки, а если количество не 0 и workers равен NULL то это дикий феил с вызывающей функцию стороны - можно разве что сделать debug assert. В любом случае если при каком-то некорректном аргументе нужно выйти из функции, я бы не делал if с гигантским телом, а написал бы

Передать в функцию могут все что угодно, поэтому практически везде запиливаю проверки на null. assert делать не удобно - в аварийной ситуации программа крешится, а хотелось бы продолжить работу. В общем случае 100% верного
методоа нет.
Цитата:
Опять же, не знаю как там с точки зрения промышленного программирования или типа того, но занулять везде переменные даже где это никому не нужно - это никому не нужно. Зачем это вообще может быть нужно?

good practice

Цитата:
int hiredate должна идти первой чтобы сразу два члена попали в первые 128 байт структуры - это оптимальнее в общем случае, в любом случае вот тут это точно хорошая практика

А какая разница?

Цитата:
Будет быстрее работать в большинстве случаев если workers почти что никогда не равен NULL - статический branch predicator даже в случае отсутствия поддержки со стороны динамического отлично отработает это ветвление. Но код будет на пару байт тяжелее

согласен в данном случае


А я думал до new/delete кто-нить докопается :oops:

Цитата:
Код:
double a,b,c,x1,x2,D,y;
...
D=b*b-4*a*c;
if(D==0)

Да ладно? И работает? :-)


 

Member
Статус: Не в сети
Регистрация: 12.09.2010
Откуда: Калининград
Delin писал(а):
А какая разница?

В данном случае никакой, а вообще при доступе через указитель на структуру или через метод класса для доступа к первым 128 байтам данных достаточно использовать 1-байтовый оффсет. Для доступа к расположенным на удалении более чем 128 байт нужен уже как минимум 2-х байтный оффсет. Размер кода получается компактнее, на производительность напрямую не влияет, но больший размер кода ухудшает кэширование - а это уже может её понизить
Delin писал(а):
good practice

Может быть это можно назвать просто стилем, но в критичных к производительности частях программы так точно делать не стоит
Delin писал(а):
Передать в функцию могут все что угодно, поэтому практически везде запиливаю проверки на null. assert делать не удобно - в аварийной ситуации программа крешится, а хотелось бы продолжить работу. В общем случае 100% верного методоа нет

См. пункт выше
Delin писал(а):
А я думал до new/delete кто-нить докопается

А я не заметил к чему там прикапываться - использовать alloca и стэк вообще в таких случаях это весьма спорный момент и нужно отталкиваться от самого проекта, фиксированный размер тем более. Остаётся единственное универсальное решение когда другие не подходят - юзать кучу
Delin писал(а):
Да ладно? И работает?

Кстати да, я это проморгал - нужно было исправить. Вряд ли это работает - я даже не протестил


 

Member
Статус: Не в сети
Регистрация: 17.10.2005
Цитата:
Может быть это можно назвать просто стилем, но в критичных к производительности частях программы так точно делать не стоит

Так это и не ботлнек, чтоб там все оптимайзить. Не спорю, есть участки кода, которые выполняются постоянно и их нужно качественно оптимизировать, зачастую в ущерб читаемости и поддержке. Оптимизировать участок кода, который выполняется пару раз - смысла нет. С проверками немного другая специфика, но они тоже нужны, в разумных пределах.

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
Статус: Не в сети
Регистрация: 15.04.2007
Откуда: Челябинск №9180
В общем продолжение банкета
Код:
#include <stdio.h>
#include <math.h>
#include <conio.h>

int main()
{
double a,b,c,x1,x2,D,y;
printf("Vedite a,b,c ");
scanf("%lf,%lf,%lf",&a,&b,&c);
D=b*b-4*a*c;
if(D=0)
{
 x1=(-b)/(2*a);
 printf("\nOtvet x=%lf",x1);
 y=a*x1*x1+b*x1+c;
 printf("\nProverka proshla uspeshno y=%lf",y);
}
else if (D>0)
  {
   x1=(-b+sqrt(D))/(2*a);
   x2=(-b-sqrt(D))/(2*a);
   printf("\nOtvet x1=%lg i x2=%lg",x1,x2);
   y=a*x1*x1+b*x1+c;
   printf("\nPervii koren' y=%lg",y);
   y=a*x2*x2+b*x2+c;
   printf("\nVtoroi koren' y=%lg",y);
  }
 else if (D<0)
   {
   printf ("\nKorni kompleksnie");
   D=-D;
   printf( "\nx1 = %lg + %lg * i", -b / (2 * a), sqrt( D ) / (2 * a) );
   printf( "\nx2 = %lg - %lg * i", -b / (2 * a), sqrt( D ) / (2 * a) );
   }
getche();

return 0;
}


препод сказал ошибка в операторах if :?:


 

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 знак равенства и теперь выполяется присвоение? Раньше и то корректнее было


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 629 • Страница 31 из 32<  1 ... 28  29  30  31  32  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  

Лаборатория














Новости

Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan