После комментария @NathanOliver - компиляторам разрешено выполнять вычисления с плавающей запятой с большей точностью, чем типы операндов. Обычно на x86 это означает, что они делают все как 80-битные значения, потому что это наиболее эффективно в оборудовании. Только когда значение сохранено, оно должно быть возвращено к фактической точности типа. И даже в этом случае большинство компиляторов по умолчанию будут выполнять оптимизации, которые нарушают это правило, потому что форсирование этого изменения в точности замедляет операции с плавающей запятой. В большинстве случаев это нормально, потому что дополнительная точность не вредна. Если вы сторонник, вы можете использовать переключатель командной строки, чтобы заставить компилятор соблюдать это правило хранения, и вы можете увидеть, что ваши вычисления с плавающей запятой значительно медленнее.
В этой функции маркировка переменной volatile
сообщает компилятору, что он не может исключить сохранение этого значения; это, в свою очередь, означает, что оно должно снизить точность входного значения, чтобы соответствовать типу, в котором оно хранится. Поэтому есть надежда, что это приведет к усечению.
И, нет, написание приведения вместо вызова этой функции - не одно и то же, потому что компилятор (в своем несоответствующем режиме) может пропустить присваивание до y
, если определит, что может генерировать лучший код без сохранения значение, и оно может также пропустить усечение. Имейте в виду, что цель состоит в том, чтобы как можно быстрее выполнять вычисления с плавающей запятой, а необходимость разбираться с правилами о снижении точности для промежуточных значений просто замедляет процесс.
В большинстве случаев серьезное применение с плавающей запятой - это то, что нужно, чтобы пропустить промежуточное усечение. Правило, требующее усечения при хранении, является скорее надеждой, чем реалистичным требованием.
В дополнение к этому, Java изначально требовала, чтобы все математические операции с плавающей запятой выполнялись с точной точностью, требуемой участвующими типами. Вы можете сделать это на оборудовании Intel, сказав, что не следует расширять типы fp до 80 бит. Это было встречено с громкими жалобами от числа сокращателей, потому что это делает вычисления намного медленнее. Вскоре Java перешла к понятию «строгий» fp и «нестрогий» fp, а при серьезном сокращении чисел используется нестрогий, т. Е. Делает его настолько быстрым, насколько это поддерживает оборудование. Люди, которые хорошо понимают математику с плавающей точкой (к которой относится , а не , включают меня), хотят скорости и знают, как справиться с разницей в точности, которая получается.