Просто с использованием расширенной точности в OS X легко:
x=11.L*x - 10.L*d;
Суффикс L
приводит к тому, что два литерала равны long double
с вместо double
с,что заставляет оценивать все выражение в 80-битном расширении согласно правилам вычисления выражений языка C.
Помимо этого, в вашем вопросе, похоже, есть некоторая путаница;вы говорите "... в Linux код будет работать без проблем".Пара моментов:
- И результат OS X, и результат Linux соответствуют IEEE-754 и стандарту C.Не существует «проблемы» ни с одним из них.
- Результат OS X воспроизводится на оборудовании, которое не поддерживает (нестандартный) 80-битный тип с плавающей запятой.Результат Linux не таков.
- Вычисления, которые зависят от промежуточных результатов, хранящихся в расширенном 80-битном формате, являются хрупкими;изменение параметров компилятора, параметров оптимизации или даже потока программы может привести к изменению результата.Результат OS X будет стабильным при таких изменениях.
В конечном счете, вы должны иметь в виду, что арифметика с плавающей точкой не является реальной арифметикой.Тот факт, что результат, полученный в Linux, ближе к результату, полученному при оценке выражения с действительными числами, не делает этот подход лучше (или хуже).
Для каждого случая, когда автоматическое использование расширенной точности сохраняло наивныйпользователь с плавающей точкой, я могу показать вам случай, когда непредсказуемость этого режима оценки приводит к тонкой и трудно диагностируемой ошибке.Их обычно называют ошибками «повышенной точности»;Одним из самых известных недавних примеров была ошибка, которая позволяла пользователям помещать 2.2250738585072011e-308
в веб-форму и сбой сервера .Конечная причина заключается именно в том, что компилятор идет за спиной программиста и поддерживает большую точность, чем было указано.Эта ошибка не была затронута OS X, поскольку выражения с двойной точностью вычисляются с двойной точностью, а не с расширенными.
Люди могут быть ознакомлены с особенностями арифметики с плавающей точкой, если система воспроизводима обеимии портативный.Оценка выражений двойной точности в двойной и одинарной точности в одинарной обеспечивает эти атрибуты.Использование расширенной точности подрывает их.Вы не можете заниматься серьезным проектированием в среде, где ваши инструменты непредсказуемы.