Функции в этой библиотеке перегружены для принятия аргументов смешанной плавающей точки (или смешанного целого числа и типа плавающей точки). Например:
foo(1.0, 2.0);
foo(1.0f, 2);
foo(1.0, 2L);
и т.д., являются действительными вызовами, если «фоо» является функцией, принимающей два аргумента с плавающей точкой. Но это оставляет вопрос:
Если все аргументы имеют один и тот же тип, то результат является тем же типом, что и аргументы.
В противном случае тип результата вычисляется по следующей логике:
- Любые аргументы, которые не являются шаблонными, не учитываются при дальнейшем анализе.
- Для каждого типа в списке аргументов, если этот тип является целым типом, то он рассматривается как двойной тип для целей дальнейшего анализа.
- Если какой-либо из аргументов является определяемым пользователем типом класса, то тип результата является первым таким типом класса, который может быть построен из всех других типов аргументов.
- Если же речь идет о каком-либо из аргументов типа<
long
double
>, то результат — типа<longdouble
>.
- Если же какой-либо из аргументов относится к типу<
double
>, то результат относится к типу<double
>.
- В противном случае получается тип<
float
>.
Например:
cyl_bessel(2, 3.0);
Возвращает результат<double
>:
cyl_bessel(2, 3.0f);
В этом случае первый аргумент рассматривается как<double
>и имеет приоритет над<float
>вторым аргументом. Чтобы получить результат<float
>, нам нужны все аргументы, чтобы быть в форме:
cyl_bessel_j(2.0f, 3.0f);
Когда один или несколько аргументов не являются шаблонным аргументом, это не влияет на тип возврата, например:
sph_bessel(2, 3.0f);
<float
>, так как первый аргумент не является шаблонным аргументом и поэтому не влияет на результат: без этого правила функции, которые принимают явно целые аргументы, никогда не могли бы вернуться<float
>.
И для определенных пользователем типов все следующие результаты возвращают<NTL::RR
>:
cyl_bessel_j(0, NTL::RR(2));
cyl_bessel_j(NTL::RR(2), 3);
cyl_bessel_j(NTL::quad_float(2), NTL::RR(3));
В последнем случае<quad_float
>конвертируется в<RR
>, но не наоборот, поэтому результат будет<NTL::RR
>. Обратите внимание, что это предполагает, что вы используетеисправленную библиотеку NTL.
Эти правила выбраны для совместимости с поведениемISO/IEC 9899:1999 Языки программирования - Cи сПроект технического доклада о расширении библиотек С++, 2005-06-24, раздел 5.2.1, пункт 5.