C - 除法不起作用
C - division doesnt work
我真的完全卡住了我不明白这个函数的行为:
#include <stdio.h>
typedef struct s_resolution
{
int x;
int y;
float fx;
float fy;
} t_resolution;
typedef struct s_pixel_info
{
int tablen;
t_resolution resolution;
char name;
int line;
int pos_suite[6];
int suite[6];
} t_pixel_info;
void get_proportion_ratio(t_pixel_info DataB, t_pixel_info pix_info,
t_resolution *proportion)
{
proportion->fx = (float)(DataB.resolution.x / pix_info.resolution.x);
//I also tried without the cast
proportion->y = (int)(DataB.resolution.y / pix_info.resolution.y * 100);
//if (proportion->y != 100)
printf("%d | %d | %d\n",proportion->y, DataB.resolution.y, pix_info.resolution.y);
}
int main()
{
t_pixel_info DataB;
t_pixel_info pix_info;
t_resolution proportion;
DataB.resolution.x = 5;
pix_info.resolution.x = 10;
DataB.resolution.y = 5;
pix_info.resolution.y = 10;
get_proportion_ratio(DataB, pix_info, &proportion);
}
DataB.resolution.y
、pix_info.resolution.y
和proportion->y
都是Int
类型。
我的问题是我得到了这个结果:
0 | 5 | 10
该操作仅在结果为 100 时有效...我一定遗漏了一些明显的东西,但我不知道是什么。
由于resolution.x
和resolution.y
是int
,它们之间的除法将按integer division
进行,只保留"whole"部分分配。如果要执行浮点 ("regular") 除法,则应在 执行除法之前转换为浮点类型 。例如:
proportion->fx = ((float) DataB.resolution.x) / ((float) pix_info.resolution.x);
你所有的除法都是对整数进行的。取这个表达式:
5 / 10 * 100
这组为:
(5 / 10) * 100
计算结果为 0
:5 / 10
为 0
,0 * 100
仍为 0
。事后施放结果不会改变它。
如果在除法之前乘以100
,您将获得多两位数的精度:
100 * 5 / 10
计算结果为 50
:100 * 5
是 500
,500 / 10
是 50
。
你也可以用浮点数来计算,例如
(double) 5 / (double) 10 * (double) 100
或者您可以只转换第一个操作数,让标准算术转换处理其余操作;结果是等价的:
(double) 5 / 10 * 100
无论哪种情况,结果都将是 50.0
我真的完全卡住了我不明白这个函数的行为:
#include <stdio.h>
typedef struct s_resolution
{
int x;
int y;
float fx;
float fy;
} t_resolution;
typedef struct s_pixel_info
{
int tablen;
t_resolution resolution;
char name;
int line;
int pos_suite[6];
int suite[6];
} t_pixel_info;
void get_proportion_ratio(t_pixel_info DataB, t_pixel_info pix_info,
t_resolution *proportion)
{
proportion->fx = (float)(DataB.resolution.x / pix_info.resolution.x);
//I also tried without the cast
proportion->y = (int)(DataB.resolution.y / pix_info.resolution.y * 100);
//if (proportion->y != 100)
printf("%d | %d | %d\n",proportion->y, DataB.resolution.y, pix_info.resolution.y);
}
int main()
{
t_pixel_info DataB;
t_pixel_info pix_info;
t_resolution proportion;
DataB.resolution.x = 5;
pix_info.resolution.x = 10;
DataB.resolution.y = 5;
pix_info.resolution.y = 10;
get_proportion_ratio(DataB, pix_info, &proportion);
}
DataB.resolution.y
、pix_info.resolution.y
和proportion->y
都是Int
类型。
我的问题是我得到了这个结果:
0 | 5 | 10
该操作仅在结果为 100 时有效...我一定遗漏了一些明显的东西,但我不知道是什么。
由于resolution.x
和resolution.y
是int
,它们之间的除法将按integer division
进行,只保留"whole"部分分配。如果要执行浮点 ("regular") 除法,则应在 执行除法之前转换为浮点类型 。例如:
proportion->fx = ((float) DataB.resolution.x) / ((float) pix_info.resolution.x);
你所有的除法都是对整数进行的。取这个表达式:
5 / 10 * 100
这组为:
(5 / 10) * 100
计算结果为 0
:5 / 10
为 0
,0 * 100
仍为 0
。事后施放结果不会改变它。
如果在除法之前乘以100
,您将获得多两位数的精度:
100 * 5 / 10
计算结果为 50
:100 * 5
是 500
,500 / 10
是 50
。
你也可以用浮点数来计算,例如
(double) 5 / (double) 10 * (double) 100
或者您可以只转换第一个操作数,让标准算术转换处理其余操作;结果是等价的:
(double) 5 / 10 * 100
无论哪种情况,结果都将是 50.0