C 为什么平均输出是inf?

C 为什么平均输出是inf?,c,casting,C,Casting,这不是我的全部代码,但这是我的设置。当我试图计算平均值时,我得到的答案是inf。相反,我应该得到一个小数点。我选错了吗?我做错了什么 typedef struct hash_table_ { data_el **order; int *number_next_calls; int *number_buckets; int *buckets_size; int *worst; int *total; float *average; int (*hash_func)(

这不是我的全部代码,但这是我的设置。当我试图计算平均值时,我得到的答案是
inf
。相反,我应该得到一个小数点。我选错了吗?我做错了什么

typedef struct hash_table_ {
  data_el **order;
  int *number_next_calls;
  int *number_buckets;
  int *buckets_size;
  int *worst;
  int *total;
  float *average;
  int (*hash_func)(char *);
  int (*comp_func)(void*, void*);
  data_el **buckets_array;
} hash_table, *Phash_table;

...
Phash_table table;
...

int temp_total,temp_buckets_size;
temp_total = *table->total;
temp_buckets_size = *table->buckets_size;
*(table->average) = (float)temp_total/(float)temp_buckets_size;
printf("%f\n",*(table->average));

如果你除以零,你要么会得到一个浮点异常(如果那些被启用的话,还有核心转储),要么会得到一个无穷大


由于您正在打印
Inf
,您似乎被您的系统所宠爱;核心转储是更好的,因为它带有偏见和过时的观点。

您需要用简单的值(
buckets\u size
是一个分配的整数数组)替换
最差的
总计
数字桶
数字桶下一次调用
的指针。关于这一点,我给了你一个很大的提示,在这个数据结构出现的问题的答案中。当然,即使在C语言中,你也不可能需要那么多的指针!temp_buckets_size的值是多少?获得无限平均值的最简单方法是除以零。@LearningC:但是存储在
temp_buckets_size
中的实际数字是多少?对于符合IEEE 754的系统,除以零是定义明确的,并且无法产生信号(除非启用了捕获异常)。如果分子为非零,则结果为+-无穷大;如果分子和分母均为0,则结果为NAN。老式的、标准前系统(除零例外)则更好!标准化的molly溺爱对新手程序员的健康有害。它不是“molly溺爱”,不管这个词是什么意思。它做的正是任何从事严肃数值计算的人所期望的。整数除零确实会产生UB(通常是SIGFPE),但对于浮点,除零不是错误,因为零不一定是精确的零。如果零是一个非常小但非零值四舍五入的结果,则被零除的正确结果是一个非常大的值(远大于最大的可表示有限值),对于该值,无穷大是最佳近似值。:过度保护和纵容。参见同义词帮宝适。对我来说,这个词似乎很合适。另外,考虑到我们正在除以两个整数,不存在非常小但非零值的问题;要么是零,要么不是。在整数算术中,如果你除以零,你肯定做错了什么。操作无法给出合理的结果,并且零是精确的,因此程序逻辑中存在错误。另一方面,在浮点运算中,有一个合理的结果,选择这种方式并不是为了帮助不称职的程序员编写错误的代码(实际上,在我看来,这会使他们的工作更加困难),而是为了数字计算专家,据我所知,他们几乎一致同意零除的行为。有争议的事情是逐渐的下溢。。。