2016-05-25 10 views
3

Я играю с арифметикой с плавающей запятой, и я столкнулся с чем-то, что нужно объяснить.C - добавление двух нормальных чисел с плавающей запятой с одинарной точностью, не может получить результат до бесконечности

При установке округления режима «к нулю», иначе:

fesetround(FE_TOWARDZERO); 

И добавляя различные виды обычных положительных чисел, я никогда не могу достичь бесконечности.

Однако из ieee 745 известно, что переполнение до бесконечности может быть результатом добавления конечных чисел.

Например:

#include <fenv.h> 
#include <stdio.h> 

float hex2float (int hex_num) { 
    return *(float*)&hex_num; 
} 

void main() { 
    int a_int = 0x7f7fffff; // Maximum finite single precision number, about 3.4E38 
    int b_int = 0x7f7fffff; 
    float a = hex2float(a_int); 
    float b = hex2float(b_int); 
    float res_add; 

    fesetround(FE_TOWARDZERO); // need to include fenv.h for that 
    printf("Calculating... %+e + %+e\n",a,b); 
    res_add = a + b; 
    printf("Res = %+e\n",res_add); 
} 

Однако, если я изменить режим округления на что-то другое, я мог бы получить + INF в качестве ответа.

Может кто-нибудь объяснить это?

+0

Я понятия не имею, что делает 'hex2float', поскольку вы даже не упоминаете библиотеку, которую используете. Но я уверен, что он не принимает 'int's .. –

+0

@EugeneSh .: определение' hex2float' находится в размещенном коде. – Dolda2000

+3

Ох. пропустил его. Строгое нарушение псевдонимов. –

ответ

6

Объяснения наблюдаемого поведения является то, что оно предусмотрено в стандарте 754-2008 с плавающей точкой IEEE:

7,4 переполнения

Исключение переполнения должно быть передано, если и только если наибольшее конечное число формата адресата превышено по величине тем, что было бы округленным результатом с плавающей запятой (см. 4), - диапазон экспоненциальности неограничен. Результат по умолчанию определяется атрибутом округления направления и знак промежуточного результата следующим образом:

[...]

б) roundTowardZero несет все перетекает по величине конечного числа формата в с знак промежуточного результата.

Таким образом, для режима округления, используемого здесь (усечения или округления к нулю), то результат в случае переполнения является крупнейшим конечным числом, не бесконечности.

+0

Спасибо! Я только что видел это сейчас ... –

 Смежные вопросы

  • Нет связанных вопросов^_^