用C语言实现inf输出的简单精度测试
试图测试精度,使总和从1到100万,但我的输出结果一直是inf用C语言实现inf输出的简单精度测试,c,sum,precision,C,Sum,Precision,试图测试精度,使总和从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 O
#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");
}
#包括
int main()
{
浮动x=0.0;
双y=0.0;
int i;
对于(i=1;ii^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;
}
intmain()
{
浮动x=0.0;
双y=0.0;
int i;
对于(i=1;i表达式i^2
表示i按位异或2
,而不是重复乘法
i^2
的某些值为零-当i=2
时-这意味着您有时会被零除
将(i^2)
替换为(i*i)
实际上,根据float
将在需要时自动升级为double
,但这取决于编译器是一个坏习惯。另外,其他读者不会清楚代码。你想用i^2做什么?如果你想平方i,那么使用i*iI已经修复了这一点,但当我打印出x和y时,我仍然会得到“inf”在你的代码中,我仍然看到一个^
符号,这是打字错误吗?是的。我很抱歉。谢谢你。我在发布我的编辑后立即意识到。如果I^2
是I
的平方,请使用I*I
代替…^
是位异或。有一个(浮点)
或(双精度)
在1/3
前面,所以它不是整数除法。@mch好的,谢谢。运算符优先级在c/c++中有点复杂。即使x原来是一个浮点数?如果你说的是printf升级:是的。我正在用你的更正测试我的代码,在我将i范围设置为1000之后(例如。i@KassandraSandoval是的。因为i*i
对于int
变量来说太多了。我更改了发布的代码。这样,您可能会得到具有更大i
值的结果。对于某些值不是这样的:仅对于i=2@LPs-您将表达式的属性与调用这些属性所需的条件混淆。表达式Session“i^2的某些值为零”是绝对正确的-满足该表达式的条件是i=2
。由于我已经说明了属性及其条件,您的批评是毫无意义的。我在编辑之前写过。您写道:i^2的某些值为零(i的奇数值)现在答案是确定的。%lf
仅用于scanf
。Printf
始终升级%f
将变量传递到double
,而不关心l
格式的一部分。我说的是其他读者不会清楚代码。我什么时候说过Printf
不会升级到doublee> ?如果我说代码不清晰,我错在哪里?float
总是升级为double
,而不是在需要时。
printf("Double Precision: ");
printf("%lf", y); //double has %lf format specifier.