Да, x87 FPU детерминирована для основных операций +
, -
, *
, /
, sqrt
. Например, в своем состоянии по умолчанию (полноразмерный синусоидальный и округлый до ближайшего-четного) результат x + y
является точно ближайшим представимым значением 80-битного значения с плавающей запятой к результату математической суммы x
и y
,
Производители совместимых чипов внедрили то же определение для операций выше.
Набор инструкций x87 в чистой традиции CISC также содержит инструкции высокого уровня для вычисления математических функций, скажем, приближения синуса (FSIN
). Результаты этих инструкций варьировались по брендам и моделям процессоров. В вашем эмуляторе вам, вероятно, нужно только предоставить что-то хорошее, как one of the worst implementations of these instructions все еще используется. Никто не должен жаловаться, если вы используете результат функции sinl()
из математической библиотеки вашего языка хоста, которая обычно лучше, чем FSIN
(в силу того, что она реализована с явными argument reduction и polynomial approximation, а не с вызовом FSIN
).
Почему FSQRT детерминированным, а FSIN нет? – Calmarius
@Calmarius Поскольку в IEEE 754 были установлены +, -, *,/и квадратный корень, как операции, которые должны были возвращать правильно округленный результат. Их часто называют пятью «основными операциями».Внедрение правильно скругленного синуса чрезвычайно сложно, поэтому стандарт не дал ему мандата, поэтому разработчики могут обеспечить синусоидальную функцию, которая не имеет правильного округления или вообще не имеет функции синуса, и все еще вызывает их реализацию, совместимую с IEEE 754. –
@Calmarius: для любого конкретного размера ввода и вывода возможно (и не сложно) построить функцию sqrt (x), которая будет знать, является ли ее результат, описанный выше, ниже или равным численно-совершенному значению. Если вы вычисляете результат, который на один бит длиннее предполагаемого результата, этот дополнительный бит и знание того, будет ли правильное значение выше или ниже представленного значения, будет достаточным для вычисления результата с любым желаемым режимом округления. Для sin (x) такое определение вообще невозможно. – supercat