如何获得最大的精度浮点数据类型的实现及其printf说明符?
或者换句话说, intmax_t
和%jd
是否等价,但对于浮点数?
这已经被问到了这里的一个侧面问题,但问题是如此之大,以至于我认为人们忘了回答这个问题。 也被标记为c ++,我正在寻找交流解决方案。
相关问题:
- C99中是否有固定尺寸的浮动和双重类型?
C11没有与intmax_t等效的浮点(具有支持的最大宽度的整数类型)。 如果未来的C应该定义某种长长的双倍,等等,语言目前没有无缝的升级路径。
C11 6.11.1.1“未来的标准化可能包括其他浮点类型,包括具有更大范围,精度或两者的长浮点类型。” 确实指出了你想象的更大宽度的可能性。
浮点数的情况不同于有需要的整数。 多年来,各种处理器的宽度整数宽度越来越大(8,16,32,64)和128。 虽然总浮点大小 相对更稳定(4,8,10,16),但精度,范围,编码,舍入已经占用了很多FP。 我怀疑接下来我们会看到十进制和二进制浮点规范。
另一个区别是整数在一个维度上增长 – 范围。 FP可以在范围和精度上独立增长,更不用说基础的特性(2,10,16等)。另请参阅下面的“IEEE 754”评论。
目前我们有3:C11 6.2.5.4:float,double和long double
。 如果你想创建一个向前兼容的路径你可以用typedef long double Xdouble
来准备改变,但是你可能不得不编写很多包装函数,比如Xdouble sinX(Xdouble x);
,为DBL_MANT_DIG
, PRIdN
等准备许多等价的定义。不小的努力。
据我所知,C没有扩展浮点类型。 唯一的浮点类型是float
, double
和long double
。 因此, %La
, %Le
, %Lf
, %Lg
和long double
似乎是您的答案。
某些实现可能会提供其他扩展类型,但它们完全超出了标准的范围。