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

时间:2014-05-31 07:52:42

标签: 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;
}

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

1 个答案:

答案 0 :(得分:3)

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

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

该标准还定义了与&#39;字符表示的转换。原则上,要求符合要求的实施是兼容的,但它有“摆动空间”。并非所有数字都必须产生相同的结果。

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

说了这么多,你可以实现你想要的结果,只要(a)你控制字符串的宽度和精度而不是保持默认值(b)你选择一个在最大值范围内的精度可用于特定格式(c)避免使用NaN等。

文章here非常有用。