对于一个问题,我必须在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.0
和return -0.0/0.0
,但最终都以-NaN的形式回答。 (虽然我可以同时输入nan和-nan)
问题是,如何检查输入是+ NaN或-NaN,以及当我想用NaN回答时如何分别分配+ NaN和-NaN?
除stdio.h +之外,我不允许使用其他标头,也不能使用double
格式-仅允许使用float
答案 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中(假设float
为get 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)
您可以使用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));
}