在 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;
}

不像 excel:^ 不是 pow a number/variable.

的方式

语言中^是异或按位运算

您的代码在 i=2 时执行 i XOR i0。然后 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,但是依赖编译器是个坏习惯。加上代码不会被其他读者看清楚。