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的表示错误仍然存在。