Има ли някакъв начин да получите правилно закръгляване с инструкцията 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