非 IEEE 754
一般来说,你不能。一致性和性能之间总是需要权衡,而 C++ 将其交给了您。
对于没有浮点运算的平台(例如嵌入式和信号处理处理器),您不能使用 C++“本机”浮点运算,至少不能移植。虽然软件层是可能的,但这对于此类设备来说肯定是不可行的。
对于这些,您可以使用 16 位或 32 位定点算术(但您甚至可能发现仅支持基本的 long - 而且 div 通常非常昂贵)。然而,这会比内置的定点运算慢得多,并且在基本的四个操作之后变得痛苦。
我还没有遇到过支持不同格式浮点的设备IEEE 754 http://en.wikipedia.org/wiki/IEEE_754。根据我的经验,最好的选择是希望有标准,因为否则您通常最终会围绕设备的功能构建算法和代码。什么时候sin(x)
突然成本增加了 1000 倍,你最好选择一个不需要它的算法。
IEEE 754 - 一致性
我在这里发现的唯一不可移植性是当您期望跨平台获得相同的结果时。影响最大的是优化器。同样,您可以牺牲准确性和速度来换取一致性。大多数编译器都有一个选项 - 例如Visual C++ 中的“浮点一致性”。但请注意,这始终是准确性beyond标准的保证。
为什么结果变得不一致?首先,FPU 寄存器通常具有比双精度寄存器更高的分辨率(例如 80 位),因此只要代码生成器不存储回值,中间值就会以更高的精度保存。
其次,等价物如a*(b+c) = a*b + a*c
由于精度有限,并不准确。尽管如此,如果允许的话,优化器可以使用它们。
另外 - 我从惨痛的教训中学到的 - 打印和解析功能在不同平台上不一定一致,可能也是由于数字不准确。
float
人们普遍误解浮点运算本质上比双精度运算快。通常,仅通过较少的缓存未命中,处理大型浮点数组就会更快。
请注意浮动精度。它可以在很长一段时间内“足够好”,但我经常看到它失败的速度比预期的要快。由于 SIMD 支持,基于浮点的 FFT 可以快得多,但在音频处理中很早就会产生显着的伪影。