【问题标题】:Equivalent of numpy.nan_to_num in C/C++等价于 C/C++ 中的 numpy.nan_to_num
【发布时间】:2016-07-05 20:14:39
【问题描述】:

如何在 C/C++ 中实现与 numpy 的 numpy.nan_to_num 函数等效的行为?

非python程序员规范:

将 nan 替换为 0,将 inf 替换为有限数。

返回一个数组或标量,将非数字 (NaN) 替换为零, (正)具有非常大的数的无穷大和负无穷大 具有非常小的(或负)数。 ... NaN 被替换为 零,无穷大(-infinity)被最大(最小或 适合输出 dtype 的最负数)浮点值。

【问题讨论】:

  • C 自 C99 起拥有fpclassify()。它将允许您检查异常浮点值(NaN、无穷大和次正规),这是您实现提供您描述的行为的函数所需要的。

标签: c++ c numerical


【解决方案1】:

我最终使用了这个,因为我想保持连续性。它也适用于 opencl,并且不需要任何 C99 内容。

float nan_to_num(float num){
  if (isinf(num)){
    if (signbit(num))
      return -MAXFLOAT;
    else
      return MAXFLOAT;
  } else {
    return num;
  }
}

【讨论】:

  • 我使用的是opencl C,它只是C99的一个子集。
  • 说得有道理,但绝对应该添加到问题中!
  • signbit 对负数返回 true。因此,如果为 true,则返回应该是 -MAXFLOAT,否则返回 MAXFLOAT。
【解决方案2】:

试试这个:

#include <math.h>

double normalize(double num)
    if (isnormal(num)){
        return num;
    } else {
        return 0;
    }
}

如果要对无穷大进行特殊处理,您还可以使用isinf(num) 作为条件并返回您选择的“大”数。

【讨论】:

    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2011-09-19
    相关资源
    最近更新 更多