我运行了这个简单的程序,但是当我从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));
}
答案 0 :(得分:11)
也许这个?
int number;
double dblNumber = (double)number;
答案 1 :(得分:7)
问题是不正确使用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 +分数= 0)* 2 ^(exp = 130-127)= 2 * 3 = 8.0但是打印为int看起来只有41000000(当然是十六进制)。
答案 2 :(得分:2)
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 */
i
的{{1}}参数隐式转换为double,只要范围内有原型。由于您包含了正确的标头,因此无需进行显式转换。