C - 师不起作用

时间:2017-11-17 10:04:23

标签: c math division

我其实完全陷入困境我不理解这个功能的行为:

#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.ypix_info.resolution.yproportion->y都是Int类型。
我的问题是我有这个结果:

0 | 5 | 10

该操作仅在结果为100时有效...我必须遗漏一些明显的东西,但我不知道是什么。

2 个答案:

答案 0 :(得分:2)

你所有的部门都是在整数上完成的。拿这个表达:

5 / 10 * 100

这组分为:

(5 / 10) * 100

此评估结果为05 / 1000 * 100仍为0。在事实之后投射结果并不会改变它。

如果您在之前乘以100 除以之后,您将获得两位精度数字:

100 * 5 / 10

此评估结果为50100 * 5500500 / 1050

您也可以在浮点运算,例如

(double) 5 / (double) 10 * (double) 100

或者你可以只转换第一个操作数并让标准算术转换处理其余的操作数;结果是等价的:

(double) 5 / 10 * 100

在任何一种情况下,结果都是50.0

答案 1 :(得分:1)

由于resolution.xresolution.yint,因此它们之间的划分将以integer division完成,它只保留除法的“整体”部分。如果要执行浮点(“常规”)除法,则应在执行除法之前强制转换为浮点类型。 E.g:

proportion->fx = ((float) DataB.resolution.x) / ((float) pix_info.resolution.x);