#include <math.h>
int _tmain(int argc, _TCHAR* argv[])
{
int i=1,n=1,s;
float sum=0;
int x;
float y;
while(i<=100)
{
s=pow((float)-1,(int)n-1);
n++;
x=(1/i)*s;
y=(1/i)*s;
printf("%d %f",x,y);
sum=sum+(1/i)*s;
i++;
}
//printf("%.3f,%d",sum,s);
return 0;
}
首先小改一下你的程序
x,y两个不同类型的变量接收
然后输出
图片附件: 游客没有浏览图片的权限,请
登录 或
注册
发现除了i=1的循环 为1外 其他全是0
再来小改一下 将i改为float型
#include <math.h>
int _tmain(int argc, _TCHAR* argv[])
{
int n=1,s;
float sum=0;
int x;
float y;
float i=1;
while(i<=100)
{
s=pow((float)-1,(int)n-1);
n++;
y=(1/i)*s;
printf("%f",y);
sum=sum+(1/i)*s;
i++;
}
//printf("%.3f,%d",sum,s);
return 0;
}
输出
图片附件: 游客没有浏览图片的权限,请
登录 或
注册
这时正常呢
为什么会出现这种情况呢
这是因为你先前定义的i为整型 1/i 所以结果被直接转换为整型进行存储
接下来我们再看下汇编码的形式
定义 float x,y,i; int n;
y=(1/i)*s;
x=(1/n)*s;
y=(1/i)*s;
0041145D
fld
dword ptr [i]
00411460
fld1
00411462
fdivrp
st(1),st
fdivrp浮点除法指令
00411464
fimul
dword ptr [s]
00411467
fstp
dword ptr [y]
x=(1/n)*s;
0041146A
mov
eax,1
0041146F
cdq
00411470
idiv
eax,dword ptr [n]
idiv为整数除法指令
那么这时整数除法舍去小数点当然只能为0
00411477
mov
dword ptr [ebp-10Ch],eax
0041147D
fild
dword ptr [ebp-10Ch]
00411483
fstp
dword ptr [x]
[
本帖最后由 hahayezhe 于 2010-5-1 13:08 编辑 ]