我正在尝试编写一个函数,该函数接收32位浮点数(已从32位二进制字符串转换)并以32位二进制形式返回先前可表示的浮点数。到目前为止,我已经从二进制转换为浮点数,但是我很难理解如何找到下一个可表示的IEEE 754值。你不能只减去可能的最小可表示值(000 0000 0000 0000 0000 0001)吗?另外,在找到最接近的可表示二进制值之前,从IEEE 754转换为Float的好处是什么(如果有的话)?
到目前为止,我只有一个将浮点数转换为简单精度32位二进制的函数。我会包含我的代码,但这是针对学校的,所以我觉得如果把它放在网上/获得明确的更正和建议。
答案 0 :(得分:4)
问:你不能简单地减去可能的最小可表示值吗?
答:不可以。浮点数以对数方式分布,而不是线性分布。减去任何固定值(如0.000001)对大型float
没有影响,并且对微小的float
值产生过大的影响。
问:在找到最接近的可表示二进制值之前,从IEEE 754转换为Float的好处是什么? 答:" IEEE 754"到" Float"通常是相同的类型 - 不发生转换。两者都是32位数字表示。
以下内容取决于float
是IEEE 754 binary32。它还取决于要匹配的int32_t
和float
的字节序。当输入为-INF
时,它会返回NaN。
float nextdown(float x) {
union {
float x;
int32_t i;
} u;
u.x = x;
if (u.i > 0) {
u.i--;
}
else if (u.i < 0) {
u.i++;
}
else {
u.i = 0x80000001;
}
return u.x;
}
以上并不能很好地处理NaN。一个简单的额外测试:
float nextdown(float x) {
// catch NaN
if (x != x) return x;
union {
float x;
int32_t i;
} u;
...
注意:OP所需的功能与用于测试此代码的<math.h>
nextafterf(x,-1.0f/0.0f)
几乎完全相同。 NaN和-INF的差异。