试图测试精度,使总和从 1 到 100 万,但我的输出一直以 inf 的形式出现。
#include <stdio.h>
int main()
{
float x=0.0 ;
double y =0.0;
int i;
for(i=1; i<100000; i = i+1)
{
x=(float) x+( 1.0f/(3.0f*(float)(i*i)));
y=(double) y+ ( 1.0/(3.0*(double)(i*i)));
}
printf("Natural Order n");
printf("Single Precision: ");
printf("%f", x);
printf("n");
printf("Double Precision: ");
printf("%lf", y);
printf("n");
}
我已经多次更改了 i 范围,但仍然得到 inf 作为我的输出。
表达式 i^2
的意思是 i BITWISE-XOR 2
,而不是重复的乘法。
i^2
的某些值为零 - 当i=2
时 - 这意味着您有时会除以零。
将(i^2)
替换为 (i*i)
。
i^2
不是i平方,而是二元操作(xor)。使用例如 i*i
相反。还有更高功率的pow
功能。
你想要的可能是以下内容:
int main()
{
float x=0.0 ;
double y =0.0;
int i;
for(i=1; i<10; i = i+1)
{
x= x+( 1.0f / ( 3.0f * (float)(i)*(float)(i) ));
y= y+( 1.0 / ( 3.0 * (double)(i)*(double)(i) ));
}
printf("Single Precision: ");
printf("%f", x);
printf("n");
printf("Double Precision: ");
printf("%f", y);
printf("n");
return 0;
}
C 不像 excel:^
不是输入数字/变量的方法。
在 c 语言 ^ 中是异或按位运算
您的代码i XOR i
在i=2
时0
。然后printf
输出 inf,因为除以零。
我用XOR A
做了很多代码优化来更改LD A, 0
......Z80会说话:)
请注意,printf
%f
格式将传递的变量提升为double
。
printf("Double Precision: ");
printf("%lf", y); //double has %lf format specifier.
实际上,根据链接float
会在需要的时候自动提升为double
,但依赖于编译器是一个坏习惯。另外,其他读者将不清楚代码。