c - 在 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
返回的数据类型。-26288
104787
我知道这会返回area * 2
并且它可能是负数,但这不是问题所在,因为我将它用于凸包算法。
int
我系统中的数据类型是16 bits
所以我知道我可以存储2^16
数字,我认为这可能是一个最大int
错误,但我也尝试使用long int
它很32 bits
长,它不起作用,它仅在我使用浮点数据类型时才有效double
,float
例如所以:
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
是否以错误的方式使用?
谢谢!
解决方案
答案很简单,因为我仍然使用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;
}
推荐阅读
- sql-server - 如何获得前几个月的名字
- javascript - 有什么功能可以读取(excel文件)中的多张纸吗?
- python-imaging-library - python枕头增加gif文件大小x10
- reactjs - 身份验证完成前受保护的路由重定向
- jmeter-5.0 - 如果我们通过 HTTPS 代理服务器记录脚本,我们如何在 jmeter 中获取记录日志?
- django - 根据周数注释查询的响应
- c# - 如何在 WQL 中定位多个远程节点?
- python - 使用 boto3 从 s3 下载时使用文件名作为文件名
- python - 如何重新索引重新采样的 Pandas DataFrame,其中缺少日期以保持当前值
- windows - 重命名自动添加的隐藏扩展