[英]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.