Каков результат приведения чисел с плавающей точкой + INF, -INF и NAN к целому числу в C? - PullRequest
12 голосов
/ 21 октября 2010

Указывает ли какой-либо стандарт, какой должен быть вывод?

Например, этот код:

#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., сборка 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!?! </p>

1 Ответ

15 голосов
/ 21 октября 2010

Как сказал Павел, оно не определено:

Из §6.3.1.4:

6.3.1.4. Действительное и целое число

Когда конечное значение реального плавающего типа преобразован в целочисленный тип другой чем _Bool, дробная часть отбрасывается (т.е. значение усечено к нулю). Если значение неотъемлемой части не может быть представлен целочисленным типом, поведение не определено .50)

Бесконечность не является конечной, и неотъемлемая часть не может быть представлена ​​в целочисленном типе, поэтому она не определена.

...