问题 将float + INF,-INF和NAN转换为C中的整数的结果是什么?


是否有任何标准规定了输出应该是什么?

例如这段代码:

#include <stdio.h>
#include <math.h>

int main(int argc, char** argv) {
  float a = INFINITY;
  float b = -INFINITY;
  float c = NAN;

  printf("float %f %f %f\n", a, b, c); 
  printf("int %d %d %d\n", (int) a, (int) b, (int) c); 
  printf("uint %u %u %u\n", (unsigned int) a, (unsigned int) b, (unsigned int) c); 
  printf("lint %ld %ld %ld\n", (long int) a, (long int) b, (long int) b); 
  printf("luint %lu %lu %lu\n", (unsigned long int) a, (unsigned long int) b, (unsigned long int) c); 

  return 0;
}

在gcc版本4.2.1(Apple Inc. build 5664)上编译目标:i686-apple-darwin10

输出:

$ gcc test.c && ./a.out 
float inf -inf nan
int -2147483648 -2147483648 -2147483648
uint 0 0 0
lint -9223372036854775808 -9223372036854775808 -9223372036854775808
luint 0 9223372036854775808 9223372036854775808

这很奇怪。 (int)+ inf <0!?!


3116
2017-10-21 11:12


起源

这是未定义的行为 - 还有什么 可以 是吗? - Paul R
WIWO:很奇怪,怪异的。 - High Performance Mark
在Java中,无穷大被转换为最接近的值(MAX_VALUE或MIN_VALUE),NaN被强制转换为0。 - starblue


答案:


保罗说,这是未定义的:

从§6.3.1.4开始:

6.3.1.4实际浮动和整数

当真实浮动类型的有限值是   转换为其他整数类型   比_Bool,小数部分是   丢弃(即值为   截断为零)。如果值   不可能是整体部分   由整数类型表示,   行为未定.50)

无穷大不是有限的,并且整数部分不能以整数形式表示,因此它是未定义的。


15
2017-10-21 11:25