当我使用实际值(float和double类型)编写程序时,我正在努力解决一些错误。 当将“real”声明为double时,在watch调试工具中,相对于此变量的值不会以易于理解的方式显示。此外,该程序没有给我正确的输出,我想知道为什么。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,integer;
double real = 0;
double average = 0;
printf("enter a real value: ");
scanf("%f",&real);
for (i=0; average < real; i++){
printf("enter an integer: ");
scanf("%d",&integer);
average = float((average+integer)/(i+1));
}
printf("\n%d numbers have been added!", i);
printf("\nthe average of all entered numbers is: %.2f",average);
return 0;
}
有些变量无法对应,因为我现在已将其翻译过来,以便让您更容易理解。
我尝试过使用强制转换操作符,删除它们,在声明中使用float和double得不到可接受的结果(并且程序也不起作用)
编辑: 程序现在正在运行,但仍然有一些数学问题,结果不是我期待的那个http://i.stack.imgur.com/Zl9dJ.jpg
答案 0 :(得分:1)
当我使用GCC编译代码时,我得到了这个:
gcc -Wall -std=gnu99 -Wextra -Werror -g -O3 -o q q.c
cc1: warnings being treated as errors
q.c: In function ‘main’:
q.c:10:5: error: format ‘%f’ expects type ‘float *’, but argument 2 has type ‘double *’
q.c:16:19: error: expected expression before ‘float’
make: *** [q] Error 1
这些警告标志很有用。要修复第10行的错误,请使用“%lf”,如评论所述。
第16行的错误是因为float
不是函数。你可以使用这样的类型转换:
average = (float)((average+integer)/(i+1))
但是这只是将结果转换为浮点数。如果您想实际使用浮点数学而不是整数数学转换为浮点数,则需要浮点操作数。最简单的方法是使用浮点文字:
average = (average+integer)/(i+1.0)
实际上,由于平均值已经是一个双倍,所以无论如何你都会用这个表达式进行浮点数学运算。虽然正如gnometorule在评论中指出的那样,这可能不是你想要做的计算。您可能希望建立所有输入数字的总和,然后除以最后输入的数字。这样可以得到你的意思。
您还想在最后一次打印结束时打印换行符:
printf("\nthe average of all entered numbers is: %.2f\n",average);
说到调试,我不了解Watches,但是gdb这样做:
(gdb) p real
$1 = 7.2999999999999998
(gdb) p average
$3 = 121.14920634920635
您可能希望在关闭优化的情况下进行编译,以便在调试器中获得更完整的信息,但是双打应该打印出来就好了。如果你正在查看包含它们的内存,你需要查看[IEEE 754]。