【发布时间】:2018-09-18 08:59:03
【问题描述】:
我找到了很多关于将float 转换为int 的答案。
我只处理正浮点值。 我一直在使用的一种简单方法是:
unsigned int float2ui(float arg0) {
float f = arg0;
unsigned int r = *(unsigned int*)&f;
return r;
}
上述代码运行良好,但未能保留数字顺序。 我的意思是:
float f1 ...;
float f2 ...;
assert( ( (f1 >= f2) && (float2ui(f1) >= float2ui(f2)) ) ||
( (f1 < f2) && (float2ui(f1) < vfloat2ui(f2)) ));
我曾尝试使用联合,但结果相同。 任何想法? 我使用 Homebrew gcc 5.3.0。
【问题讨论】:
-
你想做什么?如果您只想让您的
int具有float的截断值,则不是这样。方法就是unsigned int r = f;否则它只是一个未定义的行为。 -
浮点数和整数有非常不同的表示。将一个视为另一个会导致未定义的行为;使用指针还是联合都没有关系。你唯一可以做的就是
r = (int)f;,虽然如果f大于UINT_MAX,这会失败。 -
您是否对获取变量的数值或其按位表示感兴趣?你不能两者都做。
-
旁白:你可能更喜欢断言
(f1 >= f2) == (float2ui(f1) >= float2ui(f2)) -
代码调用未定义的行为。
标签: c floating-point ieee-754