【发布时间】:2014-07-20 23:47:56
【问题描述】:
我正在开发具有必须在 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;
}
我的问题是:all 操作系统和处理器会将浮点数转换为字符串“1.26743E+015”,只要浮点数是 IEEE 吗?我在问,因为我知道数学 CPU 可能不会返回准确的结果,我想知道这是否会在不同的处理器上产生不同的结果,因为它们可能在处理器架构内部具有不同的 IEEE 浮点运算硬件实现。
【问题讨论】:
-
可以通过
std::numeric_limits::epsilon<float>()获取当前平台实际支持的float精度。对于不同的机器架构/FPU,它可能会有所不同。 -
浮点计算在同一台机器上会产生不一致的结果,没有理由假设它在不同的操作系统上会变得更好。 sn-p 方式太人为且不完整,无法猜测。显然,您已经通过尝试在 float 中存储比它能够存储的更多数字来引发麻烦。非常不清楚截断是如何进行的。它会起作用,编译器的优化器和浮点处理器的舍入模式用这个特定值搞砸结果的可能性很小。
-
对于 X86,内部浮点计算可以以 32 位、64 位或 80 位格式执行,具体取决于浮点控制字的设置,而浮点控制字的设置可能因编译器而异。
-
@LưuVĩnhPhúc 如果您只是使用非过时的 Java 标准而没有进一步明确表示您需要可重现的浮点,那么您将无法获得可重现的浮点。 .NET 更糟糕:基本上没有办法指定您想要可重现的浮点数。并且大多数其他虚拟机都是用 C 实现的,并且让它们的用户受制于 C 的浮点变幻莫测。请在回答中解释您的意思或撤回您的评论。
标签: c++ floating-point precision floating-accuracy floating-point-conversion