繁体   English   中英

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

[英]Will different math CPUs yield the same floating point results?

我正在开发具有必须在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;
}

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

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

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

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

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

尽管如此,只要(a)您控制字符串的宽度和精度而不是将其保留为默认值(b)您选择的精度完全在可用的最大值之内,您就可以实现所需的结果。特殊格式(c)避免使用NaN和类似物。

这篇文章在这里是非常有帮助的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM