c - 浮点文字 “.1” 与 C 中的 “0.1” 相同吗?

标签 c

在C程序的源文本中,.10.1具有相同的值吗?

最佳答案

.1 表示十分之一,与 0.1 相同。但是,由于 C 标准缺乏严格性,根据 C 2018 6.4.4.2 5,.10.1 不一定会转换为相同的内部值。在所有具有合理质量的编译器中将是相同的。 (6.4.4.2 5 说“同一源形式的所有浮点常量应转换为具有相同值的相同内部格式。”脚注 77 给出了具有相同数学值但不一定转换为相同值的源形式的示例。内部值(value)。)

源文本中的浮点常量被转换为内部格式。最常见的是使用基于二进制的格式。大多数十进制数字(包括 0.1)不能完全用二进制 float 表示。因此,当它们被转换时,结果将被四舍五入(以二进制形式)为可表示的值。在典型的 C 实现中,.1 变为 0.1000000000000000055511151231257827021181583404541015625。

所有优秀的编译器都会将 .10.1 转换为相同的值。 C 标准对此不严格的原因是,涉及指数或许多数字的其他浮点文字很难(在某种意义上)转换为具有理想舍入的二进制浮点。从历史上看,有一些 C 实现会伪造转换。 C 标准通过不对浮点值的处理提出严格要求来适应这些实现。 (今天,好的算法是众所周知的,任何好的编译器都应该将浮点文字转换为最接近的可表示值,并与偶数低位数字相关,除非用户另有要求。)

因此,C 标准不保证 .10.1 具有相同的值。然而,在实践中,他们会的。

关于c - 浮点文字 “.1” 与 C 中的 “0.1” 相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51793657/

相关文章:

c - 32位变量溢出

c - scanf 之后 fgets 不起作用

c - 在宏中使用 "#"时出错

c - 向 C 二进制文件添加 ASCII 注释?

c - 在 C 中使用常量进行浮点计算?

c - 运行时错误 "Segmentation Fault"。如何去除它? (我在 Ubuntu 中工作。)

c - 如何编写将 float* 转换为 float_ptr 的 C 宏?

c - C中的内存映射文件

c - 如何找到数组的大小(从指向数组第一个元素的指针)?

c - Exec 给定字符串变量 args 并在 c 中输入 args