如何解释C中的浮点文字?

时间:2009-03-16 02:38:38

标签: c syntax floating-point

在C程序中,当您编写像3.14159这样的浮点文字时,是否有标准解释或者它是编译器还是体系结构依赖?关于如何解释浮点字符串,Java是exceedingly clear,但是当我阅读K& R或其他C文档时,这个问题似乎已经被解读了。

3 个答案:

答案 0 :(得分:5)

它取决于架构。 这通常意味着IEEE 754,但不一定。 C标准(ISO 9899:1999)主要在第5.2.4.2.2节“浮动类型的特征”中对此进行了讨论。

答案 1 :(得分:3)

根据C99标准,第6.4.4.2节浮动常数,第3段(强调我的):

  

有效数部分被解释为(十进制或十六进制)有理数;该   指数部分中的数字序列被解释为十进制整数。对于小数   浮点常数,指数表示有效位数部分的幂10   缩放。对于十六进制浮点常量,指数表示2的幂   有效部分的缩放比例。对于十进制浮点常量,也适用于   当FLT_RADIX不是2的幂时,十六进制浮点常量,结果也是   最近的可表示值,或者更大或更小的可表示值   与最接近的可表示值相邻,以实现定义的方式选择。   对于FLT_RADIX为2的幂的十六进制浮点常量,结果为   正确舍入。

因此,您将以实现定义的方式在一个ULP内得到一个常量。回想一下实现定义的意味着实现(在这种情况下,C运行时)可以选择任何选项,但必须记录选项。因此,您可以参考libc运行时文档以了解舍入的发生方式。

答案 2 :(得分:2)

您不清楚是否将浮点文字作为源代码的一部分(编译器解析为依赖于体系结构的二进制表示),或者由库函数扫描,例如scanf(),{{1 }},atof()strtol()strtod()(在运行时,转换为内存strtold()floatdouble值)。

在第一种情况下,它是ISO / IEC 9899:1999(ISO C99),§6.4.4.2“浮动常数”的一部分。它定义了词典以及它应该如何解释。

在第二种情况下,库函数的行为在§7.20.1“数字转换函数”中定义。

我没有以前标准的硬拷贝(ANSI C,1989),但我很确定它也非常精确地定义了如何解析和转换浮点数。

如果您想知道是否有标准以二进制格式表示这些值,在内存中,答案是否定的。 C语言旨在接近架构,而不是对其施加约束。因此,内存中表示始终取决于体系结构。但是C标准定义了如何对浮点值执行算术。它遵循IEC 60559标准。在ISO C99标准中,它在附录F(规范性),“IEC 60559浮点运算”中描述。实施可能会也可能不会实施此标准。如果是,则必须定义long double预处理器名称。