Здравствуйте, m.a.smirnoff, Вы писали:
MAS>Это все гадание на кофейной гуще, и очень сильно зависит от оптимизатора и целевой платформы. Чего бы мне как раз не хотелось.
Ну таки для совсем конкретной целевой платформы можно написать функции на ассмеблере...
Но в целом интересно посмотреть во что скомпилируетсяю ИМХО если подставится, то шансов, на то, что скомпилируется не в то мало довольно...
Хотя что таки удержало авторов стандарта от введения методов установки частей числа --
С другой стороны, я не понимаю, на кой вообще нужен тип std::complex. Всю жизнь считал на массивах пар чисел или парах массивов чисел и никакого дискомфорта не испытывал

ИМХО он может пригодиться только если таки будет аппаратная поддержка.
А так лишний повод для компилятора выгружать регистры FPU в память
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, 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, да любой из популярных современных компиляторов справились бы с заданием не хуже. ИМХО, не следует заморачиваться проблемами, которые способен решить любой компилятор.
Здравствуйте, 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);
Здравствуйте, 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.
*/