【问题标题】:Log calls return NaN in C [duplicate]日志调用在 C 中返回 NaN [重复]
【发布时间】:2016-05-05 23:18:25
【问题描述】:

我有一个双精度数组:

double theoretical_distribution[] = {1/21, 2/21, 3/21, 4/21, 5/21, 6/21};

我正在尝试将它的熵计算为:

double entropy = 0;

for (int i = 0; i < sizeof(theoretical_distribution)/sizeof(*theoretical_distribution); i++) {
    entropy -= (theoretical_distribution[i] * (log10(theoretical_distribution[i])/log10(arity))); 
}    

但是我得到的是 NaN,我已经检查了部分

(theoretical_distribution[i] * (log10(theoretical_distribution[i])/log10(arity)))  

发现它自己返回 NaN,所以我认为它是罪魁祸首,但它应该只是对日志进行简单的基本转换?我是否遗漏了有关它的数学的一些细节?
为什么它评估为 NaN。

【问题讨论】:

  • 1/21 --> 1.0/21 同上。
  • 整数除法截断,结果为0。0的对数为NaN。
  • @Mark Ransom "0 的日志是 NaN" 或者可能是 -INF。 OP 等式的其余部分是 NaN。

标签: c math logarithm


【解决方案1】:

您将0 传递给log10 函数。

这是因为您的数组theoretical_distribution 填充了整数计算产生的常数值,所有这些值的分母都大于分子。

您可能打算进行浮点计算,因此请至少将分子或分母之一设为浮点常量。

【讨论】:

  • 是的,做到了!谢谢你。同时向@BLUEPIXY 致敬,他的响应速度最快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
  • 2014-07-01
  • 2015-10-25
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多