簡體   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