在C程序中,当您编写像3.14159这样的浮点文字时,是否有标准解释或者它是编译器还是体系结构依赖?关于如何解释浮点字符串,Java是exceedingly clear,但是当我阅读K& R或其他C文档时,这个问题似乎已经被解读了。
答案 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()
,float
或double
值)。
在第一种情况下,它是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
预处理器名称。