Свойства 80-битных вычислений с расширенной точностью, начиная с аргументов двойной точности

Вот две реализации интерполяционных функций. аргументацияu1 всегда между0. а также .1.

#include 

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 doubles, все вычисления в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 или что между ними есть минимальное расстояние? Существует ли метод определения значения и ширины для промежуточных вычислений, при которых это свойство будет гарантировано истинным?

РЕДАКТИРОВАТЬ: для всех случайных значений, которые я пробовал, свойство сохранялось, когда промежуточные вычисления выполнялись внутри с расширенной точностью. Еслиinterpol_80() взялlong double аргументы, было бы относительно легко построить контрпример, но вопрос здесь конкретно о функции, которая принимаетdouble аргументы. Это значительно усложняет создание контрпримеров, если таковые имеются.

Примечание: компилятор, генерирующий инструкции x87, может генерировать тот же код дляinterpol_64() а такжеinterpol_80(), но это касается моего вопроса.

Ответы на вопрос(2)

Ваш ответ на вопрос