Есть ли способ получить правильное округление с помощью инструкции i387 fsqrt?

Есть ли способ получить правильное округление с помощью инструкции i387 fsqrt?...

... помимо изменения режима точности в управляющем слове x87 - я знаю, что это возможно, но это не разумное решение, потому что у него есть неприятные проблемы типа повторного входа, когда режим точности будет неправильным, если операция sqrt будет прервана.

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

С некоторыми операциями это можно обойти с помощью смещений. Например, я могу избежать избыточной точности в результатах сложения, добавив смещение в виде степени двойки, которая переводит 52 значащих бита значения двойной точности в последние 52 бита 63-битной мантиссы расширенной точности. . Но я не вижу очевидного способа сделать такой трюк с квадратным корнем.

Есть умные идеи?

(Также помечен как C, потому что предполагаемое приложение является реализацией функций C sqrtи sqrtf.)

8
задан R.. 13 March 2012 в 04:06
поделиться