首页 > 解决方案 > 在 C 中使用 int 数据类型进行行列式计算的错误结果

问题描述

我想知道

为什么不能使用int数据类型计算所有这些?

所以,我试图使用 C 中的行列式计算三角形面积,我使用的是turbo C 2.0(我知道是旧的),当我使用int数据类型时我得到一个计算不准确,我真的不知道为什么,这是我用来计算行列式的代码

#include <stdio.h>
#include <conio.h>

int Area(int ax, int ay, int bx, int by, int cx, int cy)
{
    return ax * by - ay * bx + bx * cy - by * cx + cx * ay - cy * ax;
}

int main()
{
    int ax, ay, bx, by, cx, cy;

    ax = 548;
    ay = 125;
    bx = 544;
    by = 344;
    cx = 68;
    cy = 209;

    clrscr();
    printf("%d", Area(ax, ay, bx, by, cx, cy));

    getch();
    return 0;
}

使用它应该int返回的数据类型。-26288104787

我知道这会返回area * 2并且它可能是负数,但这不是问题所在,因为我将它用于凸包算法。

int我系统中的数据类型是16 bits所以我知道我可以存储2^16数字,我认为这可能是一个最大int错误,但我也尝试使用long int它很32 bits长,它不起作用,它仅在我使用浮点数据类型时才有效doublefloat例如所以:

float Area(float ax, float ay, float bx, float by, float cx, float cy)
{
    return ax * by - ay * bx + bx * cy - by * cx + cx * ay - cy * ax;
}

有了这个我得到了正确的答案,我的问题是,再次,

为什么不能使用int数据类型计算所有这些?

int是否以错误的方式使用?

谢谢!

标签: cmatrixturbo-cdeterminants

解决方案


答案很简单,因为我仍然使用int作为参数,因为int这里只是16 bits,它可以表示的最大正数由2^16 / 2 - 1 = 65,536 / 2 - 1我们除以 2 给出,因为它也表示负值, - 1 因为它也表示数字 0所以我们得到 65,536 / 2 - 1= 32,767的结果104784显然溢出了它可以表示的最大正数,所以它被截断-26288以适合int数据类型。

我有点厌倦地注意到我仍在使用 int 变量作为参数,我已经知道这一点,但非常感谢@MikeCAT 让我仔细检查,以便我意识到。

我以为我long int出于某种原因将其用作论据,而实际上并非如此。

long int Area(int ax, int ay, int bx, int by, int cx, int cy)
{
    return ax * by - ay * bx + bx * cy - by * cx + cx * ay - cy * ax;
}

所以ax * by - ay * bx + bx * cy - by * cx + cx * ay - cy * ax表达式仍然被计算为int,我只需要更改参数数据类型。正确的路:

long int Area(long int ax, long int ay, long int bx, long int by, long int cx, long int cy)
{
    return ax * by - ay * bx + bx * cy - by * cx + cx * ay - cy * ax;
}

推荐阅读