gpt4 book ai didi

c - C语言中 float 相减

转载 作者:行者123 更新时间:2023-11-30 20:58:30 30 4
gpt4 key购买 nike

#include <stdio.h>
#include <stdlib.h>

float sum (float *A, int len) // sum of table of floats
{
float ss = 0.0;
int i;

for(i=0; i < len; ++i)
ss +=A[i];
return ss;
}
void print(float A[][3], int row) //// procedure that prints sum of elements for each row in 2D table
{
int i, j;
float k;

for(i = 0; i < row; i++)
{
k=0.0;
for(j = 0; j < 3; j++)
{
k=A[i][j]+k;
}
printf (" %2.2f \n", k);
}
return;
}
int compare(const void *p,const void *q) // sort 2D table in ascending order by sum in rows

{
float *a = (float*)p;
float *b = (float*)q;
float l=sum(a,3);
float r=sum(b,3); // CORRECTLY WRITTEN COMPARE FUNCTION
if (l<r) return -1;
if (l==r) return 0;
else return 1;
}

/* int compare(const void *p,const void *q)
{
float *a = (float*)p;
float *b = (float*)q;
float l=sum(a,3);
float r=sum(b,3); // WRONGLY WRITTEN COMPARE FUNCTION
return l-r;
} */

int main()
{
float TAB_1[ ][3]= {{1.3,2.4,1.1},{4.9,5.9,0.},{5.1,5.1, 1.1},{6.1,7.0,0.3},{1.3,1.3, 3.1},
{1.3,1.3, 0.1},{4.4,4.3, 4.1},{1.3,1.2, 3.1},{1.3,1.3, 8.1}};

print(TAB_1,sizeof(TAB_1)/sizeof(TAB_1[0]) );
qsort(TAB_1,sizeof(TAB_1)/sizeof(TAB_1[0]),sizeof(TAB_1[0]),compare);
puts("");
print(TAB_1, sizeof(TAB_1)/sizeof(TAB_1[0]));
return 0;
}

为什么我标记为 WRONGLY WRITTEN COMPARE FUNCTION 的注释函数会产生错误的输出?这是 C 中浮点表示的问题还是减法 2 个 float 的问题?有人可以解释一下吗?

最佳答案

l-r 的比较函数如果这两个数字之间的差值小于1,则错误,更准确地说,如果 abs(l-r) < 1 。原因是浮点运算的结果l-r转换为int ,以及 0..0.99999.. 之间的任何内容将产生0 ,就像这两个数字相等一样(即使它们不相等)。

下面的简短程序说明了这一点:

int main() {

float f1 = 3.4;
float f2 = 3.7;

int compareResultWrong = f2 - f1;
int compareResultOK = (f1 < f2);

printf("result should be 1; Wrong: %d, OK: %d\n", compareResultWrong, compareResultOK);
}

关于c - C语言中 float 相减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52136837/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com