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