Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不同的数学CPU会产生相同的浮点结果吗?_C++_Floating Point_Precision_Floating Accuracy_Floating Point Conversion - Fatal编程技术网

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

C++ 不同的数学CPU会产生相同的浮点结果吗?,c++,floating-point,precision,floating-accuracy,floating-point-conversion,C++,Floating Point,Precision,Floating Accuracy,Floating Point Conversion,我正在开发操作系统的便携软件,该软件具有必须在Linux、UNIX和Windows上运行的单元测试 假设此单元测试断言IEEE单精度浮点值1.26743237e+015f已转换为字符串: void DataTypeConvertion_Test::TestToFloatWide() { CDataTypeConversion<wchar_t> dataTypeConvertion; float val = 1.26743237e+015f; wchar_t *

我正在开发操作系统的便携软件,该软件具有必须在Linux、UNIX和Windows上运行的单元测试

假设此单元测试断言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;
}
void DataTypeConvertion_Test::TestToFloatWide()
{
CDATA类型转换数据类型转换;
浮动值=1.26743237e+015f;
wchar_t*valStr=(wchar_t*)数据类型转换.ToFloat(val);

不幸的是,答案很可能是否定的。在不同的平台上,无法保证浮点数与任意字符串之间的转换

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

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

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

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


这篇文章很有帮助。

当前平台上支持的实际
浮点
精度可以通过获得。对于不同的机器体系结构/FPU,它可能会有所不同。浮点计算可能会在同一台机器上产生不一致的结果,没有理由假设它在不同的操作中会更好这段代码太过人工,太不完整,无法进行猜测。很明显,你试图在一个浮点中存储的数字超过了它所能存储的数量,这已经引起了麻烦。非常不清楚截断是如何执行的。它会起作用的,编译器的优化器和浮点处理器的舍入模式几乎不可能改变使用此特定值更新结果。对于X86,内部浮点计算可以以32位、64位或80位格式执行,具体取决于浮点控制字的设置,每个编译器的设置可能有所不同。@LưuVĩnhPhúc,如果您只使用非过时的Java标准,而不进一步明确想要可复制的浮点,你就得不到可复制的浮点..NET更糟糕的是:基本上没有办法指定你想要可复制的浮点。而且大多数其他虚拟机都是用C实现的,让它们的用户任凭C的浮点变化摆布。请在回答或回复中解释你的意思t您的评论。将字符串转换为
double
的.NET方法并非在所有情况下都执行正确的舍入;对于某些输入字符串,当使用x87浮点数学时,它们将在32位模式下正确舍入,而不是在使用SSE浮点数学的64位模式下。所有平台都应精确转换其中的每个字符串精确表示值的1/4ulp,但当给定的字符串与最近的表示值接近1/2ulp时,可能会有所不同(由于其他一些表示值更接近,因此与最近的表示值的距离不能超过1/2ulp)