简单的精度测试,以 C 格式获得 INF 输出



试图测试精度,使总和从 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 ii=20。然后printf输出 inf,因为除以零。

我用XOR A做了很多代码优化来更改LD A, 0......Z80会说话:)

请注意,printf %f格式将传递的变量提升为double

printf("Double Precision: ");
printf("%lf", y);               //double has %lf format specifier.

实际上,根据链接float会在需要的时候自动提升为double,但依赖于编译器是一个坏习惯。另外,其他读者将不清楚代码。

最新更新