在 C 中获取 inf 输出的简单精度测试
simple precision test getting inf output in C
尝试测试从 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");
}
我已经更改了很多次我的范围,但仍然将 inf 作为我的输出。
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:^
不是 pow a number/variable.
的方式
您的代码在 i=2
时执行 i XOR i
即 0
。然后 printf
由于被零除而输出 inf。
我做了很多代码优化,将 LD A, 0
更改为 XOR A
...Z80 talking :)
请注意 printf
%f
格式将传递的变量提升为 double
。
表达式i^2
表示i BITWISE-XOR 2
,不重复乘法
i^2
的某些值为零 - 当 i=2
时 - 这意味着您有时会除以零。
将(i^2)
替换为(i*i)
。
printf("Double Precision: ");
printf("%lf", y); //double has %lf format specifier.
其实根据link float
会在需要的时候自动提升为double
,但是依赖编译器是个坏习惯。加上代码不会被其他读者看清楚。
尝试测试从 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");
}
我已经更改了很多次我的范围,但仍然将 inf 作为我的输出。
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:^
不是 pow a number/variable.
您的代码在 i=2
时执行 i XOR i
即 0
。然后 printf
由于被零除而输出 inf。
我做了很多代码优化,将 LD A, 0
更改为 XOR A
...Z80 talking :)
请注意 printf
%f
格式将传递的变量提升为 double
。
表达式i^2
表示i BITWISE-XOR 2
,不重复乘法
i^2
的某些值为零 - 当 i=2
时 - 这意味着您有时会除以零。
将(i^2)
替换为(i*i)
。
printf("Double Precision: ");
printf("%lf", y); //double has %lf format specifier.
其实根据link float
会在需要的时候自动提升为double
,但是依赖编译器是个坏习惯。加上代码不会被其他读者看清楚。