Есть ли способ получить правильное округление с помощью инструкции i387 fsqrt? ...
... помимо изменения режима точности в контрольном слове x87 - я знаю, что это возможно, но это не разумное решение, потому что оно имеет неприятные проблемы типа повторного входа, где режим точности будет неправильным если операция sqrt прервана.
Проблема, с которой я имею дело, заключается в следующем: код операции x87 fsqrt
выполняет правильно округленную (в соответствии с IEEE 754) операцию с квадратным корнем в точности регистров fpu, которая, как я предполагаю, расширена (80 -бит) точность. Однако я хочу использовать его для реализации эффективных функций квадратного корня одинарной и двойной точности с правильно округленными результатами (в соответствии с текущим режимом округления). Поскольку результат имеет избыточную точность, второй этап преобразования результата в раунды с одинарной или двойной точностью снова может привести к неправильному округлению результата.
С некоторыми операциями можно обойти это с предвзятостью. Например, я могу избежать излишней точности в результатах сложения, добавив смещение в форме степени двойки, которая вынуждает 52 значащих бита значения двойной точности в последние 52 бита 63-битной мантиссы с расширенной точностью , Но я не вижу очевидного способа сделать такой трюк с квадратным корнем.
Какие-нибудь умные идеи?
(также помечен как C, поскольку предполагаемое приложение - реализация функций C sqrt
и sqrtf
.)