Я занимаюсь разработкой портативного программного обеспечения ОС, в котором есть модульные тесты, которые должны работать в Linux, UNIX и Windows.
Представьте себе этот модульный тест, который утверждает, что значение с плавающей точкой одинарной точности IEEE 1.26743237e + 015f преобразуется в строку:
void DataTypeConvertion_Test::TestToFloatWide()
{
CDataTypeConversion<wchar_t> dataTypeConvertion;
float val = 1.26743237e+015f;
wchar_t *valStr = (wchar_t*)dataTypeConvertion.ToFloat(val);
std::wcout << valStr << std::endl;
int result = wcscmp(L"1.26743E+015", valStr);
CPPUNIT_ASSERT_EQUAL(0, result);
delete [] valStr;
}
Мой вопрос: Уилл все ОС и процессоры преобразуют число с плавающей точкой в строку «1.26743E + 015», если число с плавающей точкой является IEEE? Я спрашиваю, поскольку знаю, что математические процессоры могут не давать точных результатов, и мне было интересно, если бы это дало разные результаты на разных процессорах, поскольку они могут иметь разные аппаратные реализации операций IEEE с плавающей запятой внутри архитектуры процессора.
К сожалению, ответ, скорее всего, будет нет. Преобразование числа с плавающей запятой в и из произвольных строк не гарантируется на разных платформах.
В принципе, по крайней мере, все процессоры, с которыми вы можете столкнуться, соответствуют стандарту IEEE 754. Стандарт достаточно строг, поскольку он определяет арифметику с плавающей запятой. Вы можете добавлять / вычитать / умножать или делить числа с плавающей запятой с разумным ожиданием получения идентичных результатов для разных платформ на уровне битов.
Стандарт также определяет преобразование в и из «символьного представления». В принципе это требует соответствия реализаций, чтобы быть совместимым, но у него есть «пространство для маневра». Не все числа должны давать одинаковые результаты.
Вы также должны знать, что точность и формат по умолчанию могут отличаться для разных платформ.
Сказав все это, вы сможете достичь желаемых результатов, если (а) вы будете контролировать ширину и точность строк вместо того, чтобы оставить значение по умолчанию; (б) вы выберете точность, которая находится в пределах максимально доступной для конкретный формат (с) избегать NaN и тому подобное.
Статья Вот довольно полезно.