Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 转换为按位浮点时的舍入点问题_C_Bit Manipulation_Rounding_Floating_Floating Point Conversion - Fatal编程技术网

C 转换为按位浮点时的舍入点问题

C 转换为按位浮点时的舍入点问题,c,bit-manipulation,rounding,floating,floating-point-conversion,C,Bit Manipulation,Rounding,Floating,Floating Point Conversion,我正在做一个家庭作业,我们应该通过按位运算将int转换成float。以下代码有效,但遇到舍入。我的函数似乎总是向下取整,但在某些情况下它应该向上取整 例如,0x80000001应表示为0xcf000000(指数31,尾数0),但我的函数返回0xCEFFFFF。(指数30,尾数0xffffff) 我不知道如何继续解决这些舍入问题。我应该采取什么步骤来实现这一点 unsigned float_i2f(int x) { if(x==0) return 0; int sign = 0; if

我正在做一个家庭作业,我们应该通过按位运算将int转换成float。以下代码有效,但遇到舍入。我的函数似乎总是向下取整,但在某些情况下它应该向上取整

例如,0x80000001应表示为0xcf000000(指数31,尾数0),但我的函数返回0xCEFFFFF。(指数30,尾数0xffffff)

我不知道如何继续解决这些舍入问题。我应该采取什么步骤来实现这一点

unsigned float_i2f(int x) {
  if(x==0) return 0;
  int sign = 0;
  if(x<0) {
    sign = 1<<31;
    x = -x;
  }
  unsigned y = x;
  unsigned exp = 31;
  while ((y & 0x80000000) == 0)
  {
    exp--;
    y <<= 1;
  }
  unsigned mantissa = y >> 8;

  return sign | ((exp+127) << 23) | (mantissa & 0x7fffff);
}
unsigned float_i2f(int x){
如果(x==0)返回0;
int符号=0;

如果(x在计算尾数时,您显然忽略了y的最低8位


通常的规则称为“四舍五入到最接近的偶数”:如果y的最低8位大于0x80,则将尾数增加1。如果y的最低8位为0x80,且第8位为1,则将尾数增加1。在任何一种情况下,如果尾数变为大于等于0x1000000,则将尾数向右移动并增加指数。

1 x=-x是未定义的行为,如果x=INT_MIN和INT_MIN!=-INT_MAX.1这是真的,我有添加了一个特殊的if来检查这种情况。但是,问题是如何修复舍入错误,这并不能修复。James,1@gnasher729我想在第二种情况下,您应该说“y的最低8位为0x80,第9位为1”