Re[5]: std::complex
От: Erop Россия  
Дата: 07.11.07 19:41
Оценка:
Здравствуйте, m.a.smirnoff, Вы писали:

MAS>Это все гадание на кофейной гуще, и очень сильно зависит от оптимизатора и целевой платформы. Чего бы мне как раз не хотелось.


Ну таки для совсем конкретной целевой платформы можно написать функции на ассмеблере...
Но в целом интересно посмотреть во что скомпилируетсяю ИМХО если подставится, то шансов, на то, что скомпилируется не в то мало довольно...

Хотя что таки удержало авторов стандарта от введения методов установки частей числа --

С другой стороны, я не понимаю, на кой вообще нужен тип std::complex. Всю жизнь считал на массивах пар чисел или парах массивов чисел и никакого дискомфорта не испытывал
ИМХО он может пригодиться только если таки будет аппаратная поддержка.
А так лишний повод для компилятора выгружать регистры FPU в память
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: std::complex
От: rg45 СССР  
Дата: 07.11.07 20:08
Оценка: 40 (3) +1
Здравствуйте, m.a.smirnoff, Вы писали:

E>>>Очень может быть, что оно хорошо компилируется и real часть не переписывает лишний раз...


MAS>>>Что-то мне подсказывает что врядли, однако лезть в получивший ся бинарь счас не очень хочется. Может когда времени будет побольше посмотрю, что из этого безобразия получается.


E>>Казалось бы, не такая уж нереальная задачка для оптимизатора выбросить выделенные строки...


MAS>Это все гадание на кофейной гуще, и очень сильно зависит от оптимизатора и целевой платформы. Чего бы мне как раз не хотелось.


У меня тут образовалось немного лишнего времени, и решил, таки, залезть в бинарь
#include <complex>

template<typename T> 
void set_imag(std::complex<T>& dst,  T imag )
{
  dst = std::complex<T>( dst.real(), imag );
}

typedef std::complex<double> Complex;

Complex complex_value(1, 1);

int main()
{
  set_imag(complex_value, 2.0);
}

Вот код. MSVC 8.0:

int main()
{
00401000  push        ebp  
00401001  mov         ebp,esp 
00401003  and         esp,0FFFFFFF8h 
  set_imag(complex, 2.0);
00401006  fld         qword ptr [__real@4000000000000000 (4020F8h)] 
}
0040100C  xor         eax,eax 
0040100E  fstp        qword ptr [complex_value+8 (403028h)]
00401014  mov         esp,ebp 
00401016  pop         ebp  
00401017  ret


Уверен, что вижуалы 6.0, 7.0, 7.1, gcc, да любой из популярных современных компиляторов справились бы с заданием не хуже. ИМХО, не следует заморачиваться проблемами, которые способен решить любой компилятор.
--
Справедливость выше закона. А человечность выше справедливости.
Re: std::complex
От: icWasya  
Дата: 08.11.07 13:19
Оценка:
Здравствуйте, m.a.smirnoff, Вы писали:

MAS>Доброго времени суток всем.


MAS>Может кто мне объяснит какие такие соображения преследовали авторы стандартной библиотеки изобретая сабж? А именно, интерисует чего ради они не сподобились реализовать функций доступа к реальной и мнимой части комплексного числа? Почему для того чтобы изменить мнимую составляющую я должен писать конструкции типа:

MAS>
MAS>std::complex<double> z(1.0,2.0);
MAS>z = std::complex<double>(z.real(), 1.0);
MAS>

MAS>Честно говоря попахивает идиотизмом, но может я чего-то недопонимаю?

А так пробовал
std::complex<double> z(1.0,2.0);
z.imag(1.0);

Re[2]: std::complex
От: Programador  
Дата: 08.11.07 13:57
Оценка: +1
Здравствуйте, icWasya, Вы писали:

MAS>>Честно говоря попахивает идиотизмом, но может я чего-то недопонимаю?


W>А так пробовал

W>
W>std::complex<double> z(1.0,2.0);
W>z.imag(1.0);
W>

W>
так оно имеется коегде но не в стандарте от 2003-10-15
Честно говоря попахивает идиотизмом

template<class _Ty>
    class _Complex_base {
public:    
_Ty imag(const _Ty& _X)
        {return (_Im = _X); }


/*
 * Copyright (c) 1994 by P.J. Plauger.  ALL RIGHTS RESERVED. 
 * Consult your license regarding permissions and restrictions.
 */
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.