在C中识别和分配+ NaN和-NaN

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C中识别和分配+ NaN和-NaN相关的知识,希望对你有一定的参考价值。

我必须在float中输入+ NaN或-NaN并转换为另一个人工浮动形式,称为tinyfp(1个符号位,3个指数位,4个小数位),用于一个问题,

或者在tinyfp中输入(每个呈现+ NaN或-NaN)并以+ NaN或-NaN回答

这个问题特别问

浮点数中的+ NaN和-NaN应分别转换为tinyfp中相应的+ NaN和-NaN。

tinyfp中的+ NaN和-NaN应分别转换为float中对应的+ NaN和-NaN。


第一个问题是,因为我无法将NaN与任何东西(甚至是它自己)进行比较,而我可以识别输入值是否为NaN,我无法区分+ NaN和-NaN。

与第二个问题类似,当我想回答为+ NaN或-NaN时,0.0 / 0.0和-0.0 / 0.0都表示为-NaN,所以我不能回答任何+ NaN。

我试过if( input == 0.0/0.0)(input == -0.0/0.0),他们不工作。我可以试试if(input != input),但后来我无法区分+ NaN和-NaN。

对于第二个问题,我尝试了return 0.0/0.0return -0.0/0.0,但最终都回答为-NaN。 (虽然不知怎的,我可以得到输入作为nan和-nan)


所以问题是,我如何检查输入是+ NaN还是-NaN,当我想以NaN作为答案时,如何分配+ NaN和-NaN?

我不允许使用除stdio.h +之外的任何标题,我也不能使用double格式 - 只允许使用float

答案

您对可能使用的函数/标题的限制给人以强烈的印象,即您需要直接分析和操作floats的表示。这也假设了一个特定的float表示的假设,但是big-endian IEEE-754 binary32格式是一个相当不错的选择。我猜你已经在研究这个了。

您可以通过unsigned char指针访问浮点值的表示:

_Bool my_isnan(float f) {
    unsigned char *bytes = (unsigned char *) &f;
    // analyze bytes[0], bytes[1], etc. ...
}

您可以通过类似的方式操纵float表示。

我把分析/操作的细节留给你,因为这似乎是练习的关键点,我不打算为你做功课。

另一答案

如果您不被允许使用math.h,那么您自己就必须从其二进制表示中提取有关浮点值的信息。要做到这一点,你需要了解如何在IEEE-754 format中存储浮点数(假设floatIEEE-754 single precision)。如果您不知道如何存储浮点类型,那么如何在tinyfp中构造值?

所以基本上浮点数表示为s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm。您只需要使用各种方式获取基础位。然后检查if (eeeeeeee == 0xFF),因为最大指数是为IEEE-754中的inf和nan保留的。现在阅读尾数,知道它是inf还是nan。现在知道±inf±nan的标志是微不足道的,因为你已经有了标志位。所有这些都已在标准中指定,只需检查即可

另一答案

你可以使用isnanisinf函数。

要创建inf和-inf数字,您可以使用1.0 / 0.0(应该给inf)和-1.0 / 0.0(应该给-inf)。

例:

#include <stdio.h>
#include <math.h>
int main() {
  double x = 1.0/0.0;
  double y = -1.0/0.0;
  double z = sqrt(-1.0);
  printf("x = %f
", x);
  printf("y = %f
", y);
  printf("isinf(x) = %d
", isinf(x));
  printf("isinf(y) = %d
", isinf(y));
  printf("isnan(x) = %d
", isnan(x));
  printf("isnan(z) = %d
", isnan(z));
}

以上是关于在C中识别和分配+ NaN和-NaN的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫中的 NaN 值之间平均重新分配值?

NaN 分配有 innerHTML

C/C++ NaN 常量(字面量)?

为啥在多维数据集中分配值时会产生nan?

为啥要将双精度值分配给双精度值?导致 NaN

通过使用 pandas 在时间序列中在先前的 NaN 之间分配值来回填值