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