我找到了很多关于 SO 的答案,专注于转换float
to 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)) ));
我尝试使用 union 得到相同的结果。
任何想法?
我使用 Homebrew gcc 5.3.0。
您正在使用的代码(如编写的那样)具有未定义的行为。如果您想访问的表示float
s 半可移植(实现定义,定义良好,假设 IEEE 754 并且浮点和整数字节序匹配),你应该这样做:
uint32_t float2ui(float f){
uint32_t r;
memcpy(&r, &f, sizeof r);
return r;
}
对于非负值,浮点值和表示之间的映射是保序的。如果您认为您看到它无法保持秩序,我们需要确切地了解您认为反例的值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)