Vax、Cray和IBM大型机等仍然被广泛使用。这些设备现在大多数(如果不是全部)也可以进行IEEE浮点运算,但有时需要特殊的附加组件。在某些情况下(IBM),IEEE算术可能会带来明显的速度惩罚。
至于旧设备,大多数主机(Unisys、Control Data等)采用独特的浮点格式,其中大多数甚至与IEEE不太相似,更不要说实际符合标准了。
当进行优化时,Intel编译器默认启用所谓的快速数学功能。这使得数学计算更快,但会放弃严格遵守IEEE标准。您可以使用fp-model选项来强制执行严格的标准符合性。
我相信针对NVidia GPU的CUDA语言也有一个显着更快的数学库,如果愿意放弃严格遵守IEEE标准。这不仅使数学计算更快,而且特别是在超越函数中减少了使用的寄存器数量。
是否需要符合性取决于具体情况。我们遇到了Intel优化的问题,不得不开启fp-model strict
选项以确保双精度数学的正确结果。
看起来今天大多数计算机都使用IEEE-754。但是在此之前也有可用的替代方案。例如,之前使用过类似于超额128和紧缩BCD的格式(http://aplawrence.com/Basics/floatingpoint.html)。维基百科条目中也列出了一些http://en.wikipedia.org/wiki/Floating_point
。针对“C++ double 可以使用哪些其他可能的格式/标准?”这个问题,值得注意的是,在Atmel AVR平台上的gcc(一些Arduino使用的8位数据CPU)并没有将double
类型实现为64位。
请参见GCC wiki, avr-gcc 页面,特别是'Deviations from the Standard'的'double子部分',其中指出:
double
只有32位宽,并以与float
相同的方式实现
我相信其他CPU也有类似的实现,但我找不到它们。