Комментарии 5
Забавно, что железячники не осилили подумать на полшишечки вперёд. Сами они вычисляют одновременно синус и косинус, а инструкции FSIN и FCOS просто отбрасывают ненужное им значение. Однако то, что в высокоуровневых программах тоже чаще всего нужны и синус, и косинус угла одновременно, они осознали только к четвертой версии чипа — инструкция FSINCOS появилась только в i387 и фактически не использовалась до выхода вин95. До этого приходилось считать тангенс одного и того же угла два раза подряд (впрочем, обычно считали через основное тригонометрическое тождество, ибо быстрее).
Мне кажется с этим проблема сразу на всех уровнях.
Математики любят делать всякие функции типа f(x, y, z), g(x, y, z) и в принципе не предполагают что функция будет несколько чисел возвращать, но математика такое прощает.
Разработчики большинства языков программирования тоже не осилили на полшишечки подумать вперёд и почти везде у функции может быть несколько аргументов, но только один результат. В Go и Lua это не так, в языках типа С и C++ надо костыли городить с возвращением структуры с парой значений.
И наверно ещё инерция мышления - большинство операций процессора всё-таки результат в один регистр пишут, из исключения в голову только деление приходит.
Сами же пишете, что в С вы вполне легально можете вернуть из функции структуру и положить в неё что хотите (ну, если она фиксированного размера). Дальше в дело вступает ABI под конкретную ось на конкретном семействе процессоров и местное соглашение о вызовах. И если структура достаточно компактная, чтобы целиком влезть в регистры, именно так и произойдёт.
В общем, это вопрос привычки. В стандартной библиотеки С это было не слишком нужно, вот и не используется. errno это отдельная история, просто лентяям так было удобнее.
Познавательно
Второй случай — когда экспонента аргумента равна -17 или меньше.
Скорее, от -63 до -17.

Реверс-инжиниринг алгоритма тангенса в процессоре Intel 8087