双精度浮点数 - IEEE 754的替代方案

7
根据以下网站:http://en.cppreference.com/w/cpp/language/types,"double"表示双精度浮点类型,通常是IEEE-754 64位浮点类型。它说"通常",那么C++的"double"还有哪些可能的格式/标准呢?有哪些编译器使用了与IEEE格式不同的替代格式?或者架构?

我认为所有的异常情况都会非常古老。例如,我使用过一个带有60位浮点数的控制数据Cyber。 - Mark Ransom
符合C++标准的任何内容都可以。 - Alexey Frunze
你可以使用编译器开关 -ffast-math(至少对于gcc / clang,mvc有类似的选项)来禁用IEEE754。 - znkr
@krynr:这将禁用IEEE754的“评估规则”,但您仍将拥有IEEE754格式的“双精度浮点数”。 - MSalters
现实世界中有哪些CPU不使用IEEE 754标准?阅读更多:https://dev59.com/u2sz5IYBdhLWcg3wR1oc https://dev59.com/ymw05IYBdhLWcg3w3lol - phuclv
显示剩余2条评论
4个回答

6

Vax、Cray和IBM大型机等仍然被广泛使用。这些设备现在大多数(如果不是全部)也可以进行IEEE浮点运算,但有时需要特殊的附加组件。在某些情况下(IBM),IEEE算术可能会带来明显的速度惩罚。

至于旧设备,大多数主机(Unisys、Control Data等)采用独特的浮点格式,其中大多数甚至与IEEE不太相似,更不要说实际符合标准了。


4
为了简短的历史课,您可以查看Intel浮点数案例研究

当进行优化时,Intel编译器默认启用所谓的快速数学功能。这使得数学计算更快,但会放弃严格遵守IEEE标准。您可以使用fp-model选项来强制执行严格的标准符合性。

我相信针对NVidia GPU的CUDA语言也有一个显着更快的数学库,如果愿意放弃严格遵守IEEE标准。这不仅使数学计算更快,而且特别是在超越函数中减少了使用的寄存器数量。

是否需要符合性取决于具体情况。我们遇到了Intel优化的问题,不得不开启fp-model strict选项以确保双精度数学的正确结果。


2

1

针对“C++ double 可以使用哪些其他可能的格式/标准?”这个问题,值得注意的是,在Atmel AVR平台上的gcc(一些Arduino使用的8位数据CPU)并没有将double类型实现为64位。

请参见GCC wiki, avr-gcc 页面,特别是'Deviations from the Standard'的'double子部分',其中指出:

double 只有32位宽,并以与 float 相同的方式实现

我相信其他CPU也有类似的实现,但我找不到它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接