«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему арифметика с плавающей запятой отличается в x86 и x64 в Visual Studio 2010?

Почему арифметика с плавающей запятой отличается в x86 и x64 в Visual Studio 2010?

Опубликовано 15 ноября 2024 г.
Просматривать:859

Why does floating-point arithmetic differ between x86 and x64 in Visual Studio 2010?

Несоответствие арифметики с плавающей запятой между x86 и x64

В Visual Studio 2010 заметная разница в арифметике с плавающей запятой между сборками x86 и x64 возникает при сравнении значений определенных выражений. Это несоответствие проявляется в следующем коде:

float a = 50.0f;
float b = 65.0f;
float c = 1.3f;
float d = a * c;
bool bLarger1 = d 

Архитектуры x86 и x64 обрабатывают второе выражение, bLarger2, по-разному. В сборке x86 значение bLarger2 оценивается как true, а в сборке x64 — как false. Это несоответствие коренится в вычислении выражения (a * c) в операциях с плавающей запятой. модули с плавающей запятой, используемые в двух архитектурах: x87 для x86 и SSE для x64. Фундаментальное различие между этими двумя устройствами заключается в их точности. Модуль x87 по умолчанию использует точность выше одинарной (обычно двойную), тогда как модуль SSE работает исключительно с одинарной точностью.

Устранение несоответствия

Чтобы устранить проблему несоответствия, точность модуля x87 можно вручную настроить так, чтобы она соответствовала точности модуля SSE. Этого можно добиться в 32-битном коде, выполнив следующее:

_controlfp(_PC_24, _MCW_PC);Установив точность одинарной точности, оценка (a * c) в выражение bLarger2 будет соответствовать выражению сборки x64, в результате чего для bLarger1 и bLarger2 будет установлено значение false.

Вывод
_controlfp(_PC_24, _MCW_PC);

Разница в арифметике с плавающей запятой между сборками x86 и x64 связана с разными уровнями точности модулей с плавающей запятой x87 и SSE. Путем ручного управления точностью модуля x87 в соответствии с точностью модуля SSE можно устранить несоответствие, гарантируя согласованную оценку выражений в обеих архитектурах.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3