Вот две реализации функций интерполяции. Аргумент u1
всегда находится между 0.
и 1.
.Свойства 80-разрядных расширенных вычислений точности, начинающихся с аргументов двойной точности
#include <stdio.h>
double interpol_64(double u1, double u2, double u3)
{
return u2 * (1.0 - u1) + u1 * u3;
}
double interpol_80(double u1, double u2, double u3)
{
return u2 * (1.0 - (long double)u1) + u1 * (long double)u3;
}
int main()
{
double y64,y80,u1,u2,u3;
u1 = 0.025;
u2 = 0.195;
u3 = 0.195;
y64 = interpol_64(u1, u2, u3);
y80 = interpol_80(u1, u2, u3);
printf("u2: %a\ny64:%a\ny80:%a\n", u2, y64, y80);
}
На строгом IEEE 754 с платформы 80-битных long double
с, все вычисления в interpol_64()
выполняются в соответствии с IEEE 754 с двойной точностью, а в interpol_80()
в 80-битной расширенной точностью. Программа печатает:
u2: 0x1.8f5c28f5c28f6p-3
y64:0x1.8f5c28f5c28f5p-3
y80:0x1.8f5c28f5c28f6p-3
Я заинтересован в собственности «результат, возвращаемый функцией, всегда в промежутке между u2
и u3
». Это свойство ложно interpol_64()
, как показано значениями в main()
выше.
Есть ли у объекта шанс быть в состоянии interpol_80()
? Если это не так, что такое встречный пример? Помогает ли это, если мы знаем это u2 != u3
или что между ними существует минимальное расстояние? Есть ли способ определить значительную ширину для промежуточных вычислений, при которой свойство будет гарантировано истинным?
EDIT: по всем случайным значениям, которые я пытался использовать, когда промежуточные вычисления выполнялись с расширенной точностью внутри. Если interpol_80()
принял аргументы long double
, было бы относительно легко построить встречный пример, но здесь речь идет конкретно о функции, которая принимает аргументы double
. Это затрудняет создание встречного примера, если таковой имеется.
Примечание: а инструкции x87 генераторные компилятор может генерировать один и тот же код для interpol_64()
и interpol_80()
, но это по касательной к моему вопросу.
ли вы уверены, что эта программа действительно использует 80 бит точности? Современные процессоры Intel/AMD IIRC имеют встроенные 128 ф. П. Устройств с SSE и друзьями. – fuz
@FUZxxl «128-битные единицы FP» означают векторы двух двухточечных или четырех чисел с одной точностью. Но чтобы ответить на ваш вопрос, да, я уверен. Сборка находится здесь: http://pastebin.com/GaM20WZS –
+1 для контента и презентации –