谁能解释一下,在数字中加一个点有什么区别?
Can anyone explain, what's the difference when you put a dot in numbers?
程序应该从用户那里读取 5 个数字。然后它必须根据这个数字的比率抽取5'lines'。在最大数字处,它必须绘制 20 个 ' * '-s,并且对于每个其他数字,它必须绘制较少的 ' * '-s,与最大数字成比例。
有一个程序可以检查我的代码是否正确,我尝试了很多方法让它工作,但我总是得到不好的结果(图片右侧)。然后我正在检查类似练习的解决方案,我发现唯一的区别是,在解决方案中,定义的数字后有一个点
#define SEGMENT 20.
当我只更改代码中的这一点时,它工作正常(图片左侧)。有人可以解释为什么它会产生如此巨大的差异以及为什么它在没有点输入的情况下也能正常工作吗?
这是完整的代码:
#include <stdio.h>
#define PCS 5
#define SEGMENT 20
//The only difference in the line above
//#define SEGMENT 20.
int main(void) {
double nums[PCS];
int max;
//Reding the five numbers and finding the biggest value
for(int i = 0; i < PCS; i++) {
scanf("%lf", &nums[i]);
if(i == 0 || max < nums[i]) {
max = nums[i];
}
}
//Calcualte the rate for the lines
double rate = SEGMENT / max;
//Print the lines
for(int i = 0; i < PCS; i++) {
for(int j = 0; j < (int)(nums[i]*rate); j++) {
printf("*");
}
printf("\n");
}
return 0;
}
将 int
除以 int
得到 int
(截断);
7 / 2 == 3
7 / 2.0 == 3.5 (as well as 7.0 / 2)
在您的代码中 20.
只是 20.0
的 shorthand
在本声明的上下文中
double rate = SEGMENT / max;
20
是一个整数。因此表达式 20 / max
也是一个整数,在分配给 rate
之前去掉了余数
20.
与 20.0
相同 - 它是一个浮点实数值。因此,20.0 / max
被评估为实数(max
在应用除法运算之前从整数有效地提升为浮点数)。并且该表达式的结果直接分配给 rate
,没有任何舍入。
如果有帮助,您可以通过进行整数数学运算并将除法运算作为计算的最后一步来避免浮点计算(以及所有与 fp 相关的怪异行为)。
也就是说,而不是这个:
#define SEGMENT 20.0
...
double rate = SEGMENT / max;
...
for(int j = 0; j < (int)(nums[i]*rate); j++) {
这个:
#define SEGMENT 20
...
for(int j = 0; j < (int)(nums[i]*SEGMENT)/max; j++) {
这使您的数学运算保持在整数 space 并且应该仍然有效。 (免责声明:nums
仍然是一个双精度数组,所以表达式 (nums[i]*20)/max
仍然是一个浮点值,但不会产生舍入错误。
程序应该从用户那里读取 5 个数字。然后它必须根据这个数字的比率抽取5'lines'。在最大数字处,它必须绘制 20 个 ' * '-s,并且对于每个其他数字,它必须绘制较少的 ' * '-s,与最大数字成比例。
有一个程序可以检查我的代码是否正确,我尝试了很多方法让它工作,但我总是得到不好的结果(图片右侧)。然后我正在检查类似练习的解决方案,我发现唯一的区别是,在解决方案中,定义的数字后有一个点
#define SEGMENT 20.
当我只更改代码中的这一点时,它工作正常(图片左侧)。有人可以解释为什么它会产生如此巨大的差异以及为什么它在没有点输入的情况下也能正常工作吗? 这是完整的代码:
#include <stdio.h>
#define PCS 5
#define SEGMENT 20
//The only difference in the line above
//#define SEGMENT 20.
int main(void) {
double nums[PCS];
int max;
//Reding the five numbers and finding the biggest value
for(int i = 0; i < PCS; i++) {
scanf("%lf", &nums[i]);
if(i == 0 || max < nums[i]) {
max = nums[i];
}
}
//Calcualte the rate for the lines
double rate = SEGMENT / max;
//Print the lines
for(int i = 0; i < PCS; i++) {
for(int j = 0; j < (int)(nums[i]*rate); j++) {
printf("*");
}
printf("\n");
}
return 0;
}
将 int
除以 int
得到 int
(截断);
7 / 2 == 3
7 / 2.0 == 3.5 (as well as 7.0 / 2)
在您的代码中 20.
只是 20.0
在本声明的上下文中
double rate = SEGMENT / max;
20
是一个整数。因此表达式 20 / max
也是一个整数,在分配给 rate
20.
与 20.0
相同 - 它是一个浮点实数值。因此,20.0 / max
被评估为实数(max
在应用除法运算之前从整数有效地提升为浮点数)。并且该表达式的结果直接分配给 rate
,没有任何舍入。
如果有帮助,您可以通过进行整数数学运算并将除法运算作为计算的最后一步来避免浮点计算(以及所有与 fp 相关的怪异行为)。
也就是说,而不是这个:
#define SEGMENT 20.0
...
double rate = SEGMENT / max;
...
for(int j = 0; j < (int)(nums[i]*rate); j++) {
这个:
#define SEGMENT 20
...
for(int j = 0; j < (int)(nums[i]*SEGMENT)/max; j++) {
这使您的数学运算保持在整数 space 并且应该仍然有效。 (免责声明:nums
仍然是一个双精度数组,所以表达式 (nums[i]*20)/max
仍然是一个浮点值,但不会产生舍入错误。