在C程序中,当你写一个像3.14159这样的浮点文字时,有没有标准的解释,或者它是依赖于编译器还是依赖于架构?Java是关于如何解释浮点字符串的exceedingly clear,但当我阅读K&R或其他C文档时,这个问题似乎被掩盖了。
发布于 2009-03-15 18:50:55
来自C99标准的6.4.4.2节浮点常量,第3段(强调我的观点):
有效数部分被解释为(十进制或十六进制)有理数;指数部分中的数字序列被解释为十进制整数。对于十进制浮点常量,指数表示有效位部分要缩放的10的幂。对于十六进制浮点常量,指数表示有效位部分要缩放的2的幂。对于十进制浮点常量,以及当
FLT_RADIX
不是2的幂时的十六进制浮点常量,结果要么是最接近的可表示值,要么是与最接近的可表示值相邻的更大或更小的可表示值,以实现定义的方式选择。对于十六进制浮点常量,当FLT_RADIX
是2的幂时,结果被正确舍入。
因此,您将以实现定义的方式在一个ULP中获取一个常量。回想一下,实现定义意味着实现(在本例中是C运行时)可以选择任何选项,但是这个选项必须是文档化的。因此,您可以参考libc运行时文档来了解舍入是如何发生的。
发布于 2009-03-15 18:43:27
它依赖于架构。这通常指的是IEEE754,但不一定。C标准(ISO 9899:1999)主要在第5.2.4.2.2节“浮点类型的特征”中讨论了这一点。
发布于 2009-03-15 18:53:46
您不清楚是指将浮点文字作为源代码的一部分(以便编译器解析为依赖于体系结构的二进制表示形式),还是指由库函数(如scanf()
、atof()
、strtol()
、strtod()
和strtold()
)扫描的浮点文字(在运行时转换为内存中的float
、double
或long double
值)。
在第一种情况下,它是ISO/IEC9899:1999 (ISO C99)的一部分,§6.4.4.2“浮点常量”。它既定义了词典,也定义了如何解释它。
在第二种情况下,库函数的行为在§7.20.1“数值转换函数”中定义。
我没有以前的标准(ANSI,1989)的硬拷贝,但我非常确定它也非常精确地定义了如何解析和转换浮点数。
如果你想知道是否有一个标准来在内存中以二进制格式表示这些值,答案是否定的。C语言的目的是接近体系结构,而不是对其施加约束。因此,内存中的表示始终依赖于体系结构。但是C标准定义了如何对浮点值执行算术运算。它遵循IEC 60559标准。在IEC标准中,它在附录F(标准)“C99 60559浮点运算”中进行了描述。实现可能实现也可能不实现此标准。如果是,它必须定义__STDC_IEC_559__
预处理器名称。
https://stackoverflow.com/questions/649090
复制相似问题