C-印刷技术
当我编译代码时C-印刷技术,c,random,printf,C,Random,Printf,当我编译代码时 #include <stdio.h> int main() { int n, i, j; float broj; scanf("%d", &n); for (i=0; i<=n; ++i) { j=i; broj = 0.1 * j; while (j>=0) { printf ("%3.1f ", broj-(j*0.1));
#include <stdio.h>
int main() {
int n, i, j;
float broj;
scanf("%d", &n);
for (i=0; i<=n; ++i) {
j=i;
broj = 0.1 * j;
while (j>=0) {
printf ("%3.1f ", broj-(j*0.1));
j--;
}
printf(" %d. red\n", i);
}
return 0;
}
#包括
int main(){
int n,i,j;
浮子兄弟;
scanf(“%d”和“&n”);
对于(i=0;i=0){
printf(“%3.1f”,broj-(j*0.1));
j--;
}
printf(“%d.red\n”,i);
}
返回0;
}
它在第五行之后开始每隔第二行将第一个数字打印为-0.0而不是0.0,所以它就像在第五行、第七行、第九行等中一样。听起来像是一些基本的浮点精度问题。请注意,0.1不能准确地表示为
浮点
,因此每次使用它时,都将使用它的近似值
这意味着使用0.1(如代码)重复计算也将重复近似错误,这可能导致最终结果与手动执行相同计算时的预期结果略有偏差
一个好的参考是,一如既往。听起来像是一些基本的浮点精度问题。请注意,0.1不能准确地表示为
浮点
,因此每次使用它时,都将使用它的近似值
这意味着使用0.1(如代码)重复计算也将重复近似错误,这可能导致最终结果与手动执行相同计算时的预期结果略有偏差
一个好的参考是,一如既往。在打印语句中使用以下内容:
printf ("%3.1f ", broj-(float)(j*0.1));
在打印语句中使用此选项:
printf ("%3.1f ", broj-(float)(j*0.1));
太了解正在发生的事情,你可以对你的程序做一些小的改变。根据默认参数升级规则,从C标准
printf()
升级float
到double
。因此,我们可以查看double
格式(更多分数部分数字)操作中的数字的情况:
输出:
9
0.000000000000000000 0.000000000000000000 0.000000000000000000 0. red
0.100000000000000006 0.100000001490116119 0.000000001490116114 1. red
0.200000000000000011 0.200000002980232239 0.000000002980232228 2. red
0.300000000000000044 0.300000011920928955 0.000000011920928938 3. red
0.400000000000000022 0.400000005960464478 0.000000005960464455 4. red
0.500000000000000000 0.500000000000000000 -0.000000000000000028 5. red
0.600000000000000089 0.600000023841857910 0.000000023841857877 6. red
0.700000000000000067 0.699999988079071045 -0.000000011920928994 7. red
0.800000000000000044 0.800000011920928955 0.000000011920928911 8. red
0.900000000000000022 0.899999976158142090 -0.000000023841857960 9. red
输出显示由数字的有限精度引起的影响。因此,第三列应该只由零组成,但它不由零组成,因为这一效应。也了解正在发生的事情,您可以对程序进行微小的更改。根据默认参数升级规则,从C标准
printf()
升级float
到double
。因此,我们可以查看double
格式(更多分数部分数字)操作中的数字的情况:
输出:
9
0.000000000000000000 0.000000000000000000 0.000000000000000000 0. red
0.100000000000000006 0.100000001490116119 0.000000001490116114 1. red
0.200000000000000011 0.200000002980232239 0.000000002980232228 2. red
0.300000000000000044 0.300000011920928955 0.000000011920928938 3. red
0.400000000000000022 0.400000005960464478 0.000000005960464455 4. red
0.500000000000000000 0.500000000000000000 -0.000000000000000028 5. red
0.600000000000000089 0.600000023841857910 0.000000023841857877 6. red
0.700000000000000067 0.699999988079071045 -0.000000011920928994 7. red
0.800000000000000044 0.800000011920928955 0.000000011920928911 8. red
0.900000000000000022 0.899999976158142090 -0.000000023841857960 9. red
输出显示由数字的有限精度引起的影响。因此,第三列应该只由零组成,但它不由零组成,因为这种效应。这段代码的目标是什么?它的作用是什么?你能同时提供输入和预期的输出吗?另外,你有没有试过在调试器中逐行地检查代码?它可能会帮助您了解发生了什么。如果您的输入是3,则输出应该是:您的问题和添加。此代码的目标是什么?它的作用是什么?你能同时提供输入和预期的输出吗?另外,你有没有试过在调试器中逐行地检查代码?它可能会帮助您了解发生了什么。如果您的输入是3,则输出应该是:您的问题和添加。这看起来是一个有趣的主题,你说0.1不完全可以表示为浮点数是什么意思?@Srikanth请参阅我添加的链接,并阅读。@Srikanth:您需要阅读这些:和。观察到的和抱怨的行为不是由表示中的错误引起的。1。这是由于在分配给
broj
时,将double
0.1*j
转换为float
时出错造成的。如果broj
为double
,则不会打印“-0.0”,即使.1的表示错误仍然存在。这看起来是一个有趣的主题,你说0.1不完全可以表示为浮点数是什么意思?@Srikanth请参阅我添加的链接,并阅读。@Srikanth:您需要阅读这些:和。观察到的和抱怨的行为不是由表示中的错误引起的。1。这是由于在分配给broj
时,将double
0.1*j
转换为float
时出错造成的。如果broj
为double
,则不会打印“-0.0”,即使.1的表示错误仍然存在。