Почему комплексные целые числа не указаны в C++?

На этот вопрос уже был дан ответ здесь:

Почему C++ предписывает этот комплекс может быть создан только для float, double или long double?

Тем не менее, я не вижу, как ответ там действителен. Принятая причина заключается в том, что:

Вы не можете правильно реализовать многие операции std::complex над целыми числами. Например.,

шаблон T abs(const комплекс &z);

для комплекса не может быть T = длинное возвращаемое значение...

Однако я не вижу причин, почему бы и нет.

Например, если у меня есть 1234567 + 7654321i, то abs() составляет около 7753243,557. Целочисленный результат, такой как 7753243 или 7753244, может быть очень полезным. Неважно, какой результат дан, пока механизм непротиворечив. (Точно так же, как мы принимаем 5 / 3 = 1).

Может ли кто-нибудь предложить какие-либо идеи относительно того, почему комплексные целые числа недоступны?


person Harry    schedule 05.11.2014    source источник
comment
вы имеете в виду целые числа Гаусса?   -  person M.M    schedule 05.11.2014
comment
IDK, конечно, но мне непонятно, что вы ожидаете от abs(std::complex<int>(3, 5)). В любом случае вам достаточно просто написать собственный класс для реализации всего, что вы хотите сделать.   -  person M.M    schedule 06.11.2014
comment
См. stackoverflow.com/questions/11108743 для хорошего объяснения   -  person uesp    schedule 06.11.2014
comment
Спасибо за ссылку uesp. Однако я действительно не понимаю, почему только несколько операций имеют смысл. В частности, я не понимаю, что говорят о функции abs(). (Например, см. мой комментарий в ответ на Mad Physicist ниже). Я действительно не понимаю, как ответ, принятый по этой ссылке, действителен.   -  person Harry    schedule 06.11.2014
comment
Мэтт, я ожидаю, что abs(std::complex‹int›(3, 5)) вернет либо 5, либо 6. Неважно, какое из них, главное, чтобы механизм был последовательным. (Точно так же, как 5 / 3 = 1).   -  person Harry    schedule 06.11.2014


Ответы (1)


С математической точки зрения абсолютное значение комплексного числа равно квадратному корню из суммы квадратов его компонентов. Это означает, что только в очень редких случаях, таких как 3 + 4i, абсолютное значение будет целым числом (5 в этом примере). Если вы хотите, чтобы абсолютное значение было того же типа, что и параметр шаблона, то вы SOL.

person Mad Physicist    schedule 05.11.2014
comment
Конечно, может быть ошибка округления (и эта ошибка округления часто будет больше, чем при использовании типов с плавающей запятой), но я не вижу в этом проблемы. Например, если у меня есть «1234567 + 7654321i», то abs() будет около 7753243,557. Целочисленный результат, такой как 7753243 или 7753244, может быть очень полезным. - person Harry; 06.11.2014