我必须在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.0
和return -0.0/0.0
,但最终都回答为-NaN。 (虽然不知怎的,我可以得到输入作为nan和-nan)
所以问题是,我如何检查输入是+ NaN还是-NaN,当我想以NaN作为答案时,如何分配+ NaN和-NaN?
我不允许使用除stdio.h +之外的任何标题,我也不能使用double
格式 - 只允许使用float
您对可能使用的函数/标题的限制给人以强烈的印象,即您需要直接分析和操作float
s的表示。这也假设了一个特定的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中存储浮点数(假设float
是IEEE-754 single precision)。如果您不知道如何存储浮点类型,那么如何在tinyfp中构造值?
所以基本上浮点数表示为s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
。您只需要使用各种方式获取基础位。然后检查if (eeeeeeee == 0xFF)
,因为最大指数是为IEEE-754中的inf和nan保留的。现在阅读尾数,知道它是inf还是nan。现在知道±inf
和±nan
的标志是微不足道的,因为你已经有了标志位。所有这些都已在标准中指定,只需检查即可
你可以使用isnan
和isinf
函数。
要创建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));
}