2010-10-21 9 views
10

Est-ce qu'une norme spécifie quelle devrait être la sortie?Quel est le résultat de la fusion de float + INF, -INF et NAN en entier dans C?

Par exemple, ce code:

#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; 
} 

Compilé sur la version gcc 4.2.1 (Apple Inc. construire 5664) Cible: i686-pomme-darwin10

Sorties:

$ 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 

Ce qui est assez bizarre. (int) + inf < 0!?!

+4

C'est un comportement indéfini - quoi d'autre * pourrait-il être? –

+5

WIWO: bizarre, bizarre. –

+1

En Java, les infinis sont convertis à la valeur la plus proche (MAX_VALUE ou MIN_VALUE) et NaN est converti en 0. – starblue

Répondre

14

Comme Paul dit, il est défini:

De §6.3.1.4:

6.3.1.4 réel fl ottant et entier

Lorsqu'une fi valeur infinie de type réel fl ottante est converti à un entier de type autre que _Bool, la partie fractionnaire est rejetée (c'est-à-dire que la valeur est tronquée vers zéro). Si la valeur de la partie entière ne peut pas être représenté par le type entier, le comportement est unde fi ned.50)

Infinity est pas limitée, et la partie entière ne peut pas être représentée dans un type intégral , donc c'est indéfini.