在C

时间:2019-04-14 12:06:46

标签: c floating-point nan

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

或在tinyfp中输入内容(每个输入都显示+ NaN或-NaN),然后以+ NaN或-NaN回答

这个问题专门问

  

将float中的+ 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

3 个答案:

答案 0 :(得分:2)

您对可能使用的函数/标头的限制给人以强烈的印象,希望您可以直接分析和操纵float的表示形式。这也将假定为特定的float表示形式,但是大端IEEE-754 binary32格式是一个不错的选择。我想你已经在研究这个。

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

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

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

我将分析/操作的细节留给您,因为这似乎是练习的重点,而且我不会为您做功课。

答案 1 :(得分:1)

如果不允许使用math.h,则您必须靠自己,并且必须从其二进制表示形式中提取有关float值的信息。为此,您需要了解浮点数如何存储在IEEE-754 single precision中(假设floatget the integer representation value of a float type variable in C)。如果您不知道浮点类型的存储方式,那么如何在tinyfp中构造值?

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

答案 2 :(得分:0)

您可以使用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\n", x);
  printf("y = %f\n", y);
  printf("isinf(x) = %d\n", isinf(x));
  printf("isinf(y) = %d\n", isinf(y));
  printf("isnan(x) = %d\n", isnan(x));
  printf("isnan(z) = %d\n", isnan(z));
}