C中的浮点类型有下限吗?就像整数类型有下限(int 至少为 16 位)一样?
7 回答
是的。 float.h
包含常量,例如:
FLT_EPSILON, DBL_EPSILON, LDBL_EPSILON
这是最小幅度的非零值,可以用float
、double
和long double
表示。
FLT_MAX
并FLT_MIN
表示可以表示为的极端正数和负数float
。类似DBL_
并且LDBL_
可用。
FLT_DIG, DBL_DIG, LDBL_DIG
被定义为小数位数精度。
您要求的是xxx_MIN
或xxx_EPSILON
值。
沿着这些思路,这里有一个问题,我在其中发布了一些代码,它显示了 64 位 IEEE-754 浮点数的内部结构。
float.h
FLT_MIN
包含许多描述浮动类型(包括和DBL_MIN
)的各种属性的宏。
标准中给出了限制要求的描述float.h
(C90 或 C99 - 5.2.4.2.2“浮动类型的特性”)。
1E-37
特别是,根据标准,任何实现都必须支持至少forfloat
或的下限double
。但是一个实现可以自由地做得比这更好(并在FLT_MIN
和中指出它的作用DBL_MIN
)。
如果您需要,请参阅此问题以获取有关从何处获取标准文件副本的信息:
也许这有帮助:float.h 参考(它是 C++,我不确定它是否也适用于纯 C)
此草案 C99 标准 (PDF)在第 5.2.4.2.2 节中记录了浮点类型精度的最小值。
(通过维基百科在 C99 上找到。)
标准草案摘录 (n1401.pdf)
附件 F (规范) IEC 60559 浮点运算 F.1 简介 1 ...定义_ _STDC_IEC_559_ _ 的实现应符合 本附件中的规范。... F.2 类型 1 C 浮点类型符合 IEC 60559 格式,如下所示: -- float 类型符合 IEC 60559 单一格式。 -- 双精度类型符合 IEC 60559 双精度格式。 -- long double 类型匹配 IEC 60559 扩展格式...
维基百科有一篇关于 IEC 559(或者更确切地说是 IEEE 754-1985)的文章,您可能会觉得有趣。
一个有用的参考是What Every Computer Scientist Should Know About Floating-Point Arithmetic。
浮点数的性质——它的大小、精度、限制——实际上是由硬件定义的,而不是由编程语言定义的。x86 上的单精度浮点数在 C、C#、Java 和任何其他实用编程语言中都是相同的。(例外是在软件中实现奇数宽度的浮点数的深奥编程语言。)