Чтобы правильно использовать математику повышенной точности, необходимо, чтобы язык поддерживал тип, который может использоваться для хранения результатов промежуточных вычислений и может быть заменен выражениями, дающими эти результаты. Таким образом, учитывая:
void print_dist_squared(double x1, double y1, double x2, double y2)
{
printf("%12.6f", (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
должен быть какой-то тип, который можно было бы использовать для захвата и замены общих подвыражений x2-x1
и y2-y1
, что позволяет переписать код как:
void print_dist_squared(double x1, double y1, double x2, double y2)
{
some_type dx = x2-x1;
some_type dy = y2-y1;
printf("%12.6f", dx*dx + dy*dy);
}
без изменения семантики программы. К сожалению, ANSI C не смог определить какой-либо тип, который можно было бы использовать для some_type
на платформах, выполняющих вычисления с повышенной точностью, и стало гораздо более распространенным обвинять Intel в существовании типов с повышенной точностью, чем обвинять ANSI в неудачной поддержке.
Фактически, типы повышенной точности имеют такое же значение на платформах без модулей с плавающей запятой, как и на процессорах x87, поскольку на таких процессорах вычисление типа x+y+z повлечет за собой следующие шаги:
- Распакуйте мантисса, экспонента и, возможно, знак x в отдельные регистры (экспонента и знак часто могут иметь двойную койку)
- Распакуйте аналогично.
- Сдвиньте вправо мантиссу значения с меньшим показателем, если таковой имеется, а затем добавьте или вычтите значения.
- Если x и y имеют разные знаки, сдвиньте мантиссу влево до тех пор, пока крайний левый бит не станет равным 1, и соответствующим образом отрегулируйте показатель степени.
- Упакуйте экспоненту и мантиссу обратно в двойной формат.
- Распаковать этот временный результат.
- Распаковать з.
- Сдвиньте вправо мантиссу значения с меньшим показателем, если таковой имеется, а затем добавьте или вычтите значения.
- В случае, если предыдущий результат и z имели разные знаки, сдвиньте мантиссу влево до тех пор, пока крайний левый бит не станет равным 1, и соответствующим образом отрегулируйте показатель степени.
- Упакуйте экспоненту и мантиссу обратно в двойной формат.
Использование типа повышенной точности позволит исключить шаги 4, 5 и 6. Поскольку 53-битная мантисса слишком велика, чтобы поместиться менее чем в четыре 16-битных или два 32-битных регистра, выполнение сложения с 64-битной мантиссой не медленнее, чем с 53-битной мантиссой, поэтому использование математика повышенной точности обеспечивает более быстрые вычисления без недостатков в языке, который поддерживает правильный тип для хранения временных результатов. Нет причин обвинять Intel в предоставлении FPU, который может выполнять математические операции с плавающей запятой способом, который был также наиболее эффективным методом на чипах без FPU.
person
supercat
schedule
21.09.2015