不同的数学CPU会产生相同的浮点结果吗?

7 c++ floating-point precision floating-accuracy floating-point-conversion

我正在开发具有必须在Linux,UNIX和Windows上运行的单元测试的OS便携式软件.

想象一下这个单元测试断言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;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:只要浮点数是IEEE,所有操作系统和处理器都会将浮点数转换为字符串"1.26743E + 015"吗?我问,因为我知道数学CPU可能无法返回准确的结果,我想知道这是否会在不同的处理器上产生不同的结果,因为它们可能在处理器架构内部具有不同的IEEE浮点运算硬件实现.

dav*_*pfx 6

遗憾的是,答案很可能是否定的。不保证跨平台的浮点数与任意字符串的转换。

至少原则上,您可能遇到的所有处理器都符合 IEEE 754 标准。该标准相当严格,因为它定义了浮点运算。您可以加/减/乘或除浮点数,并合理期望在位级别跨平台获得相同的结果。

该标准还定义了与“字符表示”之间的转换。原则上,要求兼容的实现兼容,但它有“回旋余地”。并非所有数字都必须产生相同的结果。

您还应该注意,默认精度和格式可能因平台而异。

说了这么多,只要 (a) 您控制字符串的宽度和精度而不是将其保留为默认值 (b) 您选择的精度正好在最大可用范围内特定格式 (c) 避免 NaN 和类似格式。

这里的文章很有帮助。