【问题标题】:Why does printf output random values for double and 0.000000 for int?为什么 printf 为 double 输出随机值,为 int 输出 0.000000?
【发布时间】:2014-03-23 02:54:43
【问题描述】:

我知道这是一个简单的问题,但它是在我编码时出现的,我想知道它现在是如何工作的。所以,我的第一个问题是,当 printf 给出一个如下所示的整数,但期望 %f 浮点值时,为什么它总是输出 0.000000?我在 linux 终端上的 GCC 中运行它。

int main() {

int a = 2, b = 5, result = 0;
result = b/a*a;

printf("%f\n", result);
}
//Above printf statement outputs 0.000000 every time.

然后,当我使用下面的代码并在 printf 期望 %i 整数值时给它一个 double 时,输出始终是随机/垃圾。

int main() {

double a = 2, b = 5, result = 0;
result = b/a*a;

printf("%i\n", result);
}
//Above printf statement outputs random numbers every time.

我完全理解上面的代码是不正确的,因为 printf 输出类型与我输入的不同,但我希望它对每种形式的错误采取相同的方式,而不是像这样改变。只是引起了我的好奇心,所以我想我会问。

【问题讨论】:

  • @Dinesh int a = 2, b = 5, result = 0;
  • 这可能会满足你的好奇心:stackoverflow.com/questions/2398791/…
  • printf("%f\n", ...); 导致0.000000-0.000000 大约占所有可能double 的50%。有很多小的double。在研究 UB 时使用 printf("%a\n", ...);printf("%e\n", ...); 可以获得更多信息。

标签: c printf


【解决方案1】:

基本上是因为如果您将组成一个小整数的位解释为好像它们是一个双精度值,它看起来像 0 的双精度值。而如果您将表示一个小的双精度值的位解释为一个整数,它看起来喜欢更有趣的东西。这是一个页面的链接,该页面描述了如何使用这些位来表示双精度:http://en.m.wikipedia.org/wiki/IEEE_floating_point。通过此链接和一点点耐心,您实际上可以计算出给定 double 将被解释为的整数值。

【讨论】:

  • 从 OP 的问题看来(对我来说)他每次运行第二个片段时都会得到任意值。所以是的,如果双精度被解释为整数,它的编码会“看起来很有趣”,但我想这个双精度每次都会以相同的方式编码(至少在同一个 CPU 上......浮点设置或其他)。 我希望它对每种形式的错误都采取相同的方式,而不是像这样改变
  • 我怀疑每次他运行相同的程序时值都会发生变化。我怀疑他对他使用的每个不同的双精度都有不同的值,但它们会发生不可预测的变化。
  • 所以结果取决于数据类型的表示方式。这意味着 printf 将尝试将数据解释为预期的类型,无论输入什么,它都会因此而改变。这就说得通了。谢谢。
  • 请注意,intdouble 不需要使用相同的方法(例如堆栈与 FP 堆栈)作为函数参数传递。打印的double 可能与int result 无关。
【解决方案2】:

您使用了错误的格式说明符 应该是

int a = 2, b = 5, result = 0;
result = b/a*a;

printf("%d\n", result);

...

double a = 2, b = 5, result = 0;
result = b/a*a;

printf("%f\n", result);

【讨论】:

  • 我完全理解上面的代码是不正确的,因为 printf 的输出类型和我输入的不一样
  • 我知道我用错了。我的问题是为什么它在两种不同类型的错误输入下表现不同。我认为它们都是垃圾,第一个不是 0.000000。当我忘记更改值时,我偶然遇到了这个问题。我只是好奇是否有人知道它为什么会这样工作。
猜你喜欢
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 2013-03-17
  • 2020-09-22
  • 1970-01-01
  • 2017-01-03
相关资源
最近更新 更多