【问题标题】:Convert int to double将 int 转换为 double
【发布时间】:2012-01-28 19:07:41
【问题描述】:

我运行了这个简单的程序,但是当我从int 转换为double 时,结果为零。零的sqrt 然后显示负值。这是来自在线教程的示例,因此我不确定为什么会发生这种情况。我在 Windows 和 Unix 上试过。

/* Hello World program */

#include<stdio.h>
#include<math.h>

main()

{  int i;

   printf("\t Number \t\t Square Root of Number\n\n");

   for (i=0; i<=360; ++i)
        printf("\t %d \t\t\t %d \n",i, sqrt((double) i));


}

【问题讨论】:

  • 你能发布你的代码吗?
  • 没有有问题的代码,这个问题无法得到有意义的回答。
  • sqrt 从不返回负值。你的问题很深。您没有意识到我们需要查看您的代码来回答这个问题,这是您的根本问题。希望你不要以为电脑也能做到!
  • 大卫,实际上你应该意识到还有另一种可能性,那就是我最初忘记包含代码。请不要在此板上表现出居高临下的态度。
  • 很抱歉冒犯了你。我太苛刻了。但其中也有一定的道理。有时慢一点是值得的。在编写代码、编写问题以及在我的情况下编写 cmets 时检查并仔细检查。

标签: c printf


【解决方案1】:

也许是这个?

int number;
double dblNumber = (double)number;

【讨论】:

  • 这确实是将数字转换为双精度数的方法,但这不是提问者的问题。
  • 奇怪的是,他的问题的标题是。哦,好吧。
【解决方案2】:

问题是 printf 格式使用不正确 - 使用 %g/%f 而不是 %d

顺便说一句 - 如果您想知道您的代码在这里做了什么,这里有一些可能有助于您理解的简短解释:

printf 例程已将 sqrt 的浮点结果视为整数。有符号、无符号整数有它们的底层位表示(简单地说——这是它们在内存、寄存器等中“编码”的方式)。通过为 printf 指定格式,您可以告诉它应该如何破译特定内存区域/寄存器中的位模式(取决于调用约定等)。例如:

unsigned int myInt = 0xFFFFFFFF;
printf( "as signed=[%i] as unsigned=[%u]\n", myInt, myInt );

给出:“as signed=[-1] as unsigned=[4294967295]”

使用了一个位模式,但被视为先有符号后无符号。同样适用于您的代码。您已经告诉 printf 将用于将 sqrt 的浮点结果“编码”为整数的位模式处理。看到这个:

float myFloat = 8.0;
printf( "%08X\n", *((unsigned int*)&myFloat) );

打印:“41000000”

根据single precision floating point encoding format。 8.0 只是 (-1)^0*(1+fraction=0)*2^(exp=130-127)=2*3=8.0 但打印为 int 看起来只是 41000000(当然是十六进制)。

【讨论】:

  • 谢谢。奇怪的是,这在教程中会被忽视。我使用了 %f,现在可以正常使用了。
  • 本教程不会将 %d 用于浮点值
  • @David:您真的从未见过没有一个错字/错误的教程、书籍等吗?它发生了——真的。
【解决方案3】:

sqrt() 返回一个 double 类型的值。您不能使用转换说明符 "%d" 打印这样的值。

尝试这两种选择之一

        printf("\t %d \t\t\t %f \n",i, sqrt(i)); /* use "%f" */
        printf("\t %d \t\t\t %d \n",i, (int)sqrt(i)); /* cast to int */

只要作用域中有原型,sqrt()i 参数就会隐式转换为 double。由于您包含了正确的标题,因此不需要显式转换。

【讨论】:

  • 我不明白为什么将int 赋予sqrt() 很难,因为sqrt() 被声明为仅将double 值作为参数。在 C99 中:double sqrt (double x); 它是如何工作的,我的编译器让它通过了?
  • @RobertS:因为你包含了&lt;math.h&gt;,编译器知道sqrt()的参数必须是double,所以编译器会自动进行转换。在范围内没有原型的情况下使用 sqrt()(或任何函数)应该被视为错误。
  • 非常感谢。我还在这里发布了一个关于这个问题的问题:stackoverflow.com/questions/59310504/…。如果您想为您的答案加分,我喜欢给,您也可以在那里发布您的答案,并使其也可供有相同问题的其他人阅读。
猜你喜欢
  • 2011-05-10
  • 2013-06-02
  • 1970-01-01
  • 2019-02-19
  • 2012-09-02
  • 2013-01-20
  • 2014-12-02
  • 1970-01-01
相关资源
最近更新 更多