【发布时间】:2013-12-03 03:31:33
【问题描述】:
我使用 代码块。
当代码是:
printf("%d",1/0);
程序无法运行,出现错误。但是当我写这个时:
printf("%d",1/0.0);
程序可以运行,输出为0。我想知道为什么。
【问题讨论】:
-
下面这些人都没有告诉你的是,浮点变量中存在错误,这些错误非常很小,而且几乎从不为零,由于所谓的浮点错误。这就是 为什么 你会得到价值 inf。这与在 x 接近 0 时取 1/x 的限制相同。您的结果接近无穷大。整数除法 1/0 在数学上只是 1/0。
-
0.0 同样为零。如果您的浮点硬件设置为将其提升为 1 而不是仅返回 Inf,则浮点除以零 可能 是错误的。 (至少,如果是 758 就可以)。
-
@JonahNelson:浮点舍入与此问题中的问题行为无关。在支持无穷大的浮点系统中将源文本
0.0转换为零没有错误,执行 1 除以 0 也没有错误;结果是“完全”无穷大,没有舍入误差。观察到“0”输出的原因是 OP 正在打印带有错误说明符%d的double值。 -
@hobbs:这里与硬件无关。这种情况会受到常量折叠的影响,任何类似的除法都将在编译时用这种除法的结果代替。这里的问题是编译器在不应该的情况下在这里编译除以零。如果它是 3.0/2.0 - 例如 - 它不会在运行时计算,而是在编译时计算。
标签: c floating-point printf undefined-behavior divide-by-zero