Что конвертируется во что при сравнении двойного с целым числом для идентичности? - PullRequest
2 голосов
/ 25 сентября 2010

ОК, так что я знаю, что вы обычно не должны сравнивать два числа с плавающей точкой на равенство.Тем не менее, в Насколько бесполезны бессмысленные оценки округления в вычислениях с плавающей точкой? он показывает следующий код (я полагаю, псевдокод):

Real Function T(Real z) :
      T := exp(z) ;                       ... rounded, of course.
      If (T = 1) Return( T ) ;            ... when |z| is very tiny.
      If (T = 0) Return( T := –1/z ) ;    ... when exp(z) underflows.
      Return( T := ( T – 1 )/log(T) ) ;   ... in all other cases.
      End T .

Теперь яЯ заинтересован в реализации этого на C или C ++, и у меня есть два связанных вопроса:

a) если я возьму T в качестве двойного, то в сравнении (T == 1) или (T ==0) будут ли 0 и 1 преобразованы в удвоение, чтобы сохранить точность значений, включенных в многотипное выражение?

b) это все равно считается как сравнение двух чисел с плавающей точкой на равенство?

Ответы [ 2 ]

3 голосов
/ 25 сентября 2010

Да и да.

Для 32-битных целых чисел double может точно представлять каждое значение.Однако при сравнении значения типа double с 64-битным int возможна ошибка округления, если int больше 2 ^ 52.Однако вы можете использовать long double, который содержит не менее 64 бит мантиссы.

Конечно, лучший способ - просто использовать литерал с плавающей точкой: 1.0 или просто 1. имеет типdouble, 1.0f - это float, а my_float_type(1) имеет любой тип, который должен: v).

1 голос
/ 25 сентября 2010

Целое число преобразуется в двойное число.

См. В начале раздела 5 Выражения в стандарте C ++ .

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

Целые числа без знака могут быть представлены в точности числами с плавающей запятой, если они вписываются в мантиссу + 1 бит, для целых чисел со знаком это мантисса + 2 бита (кроме самого отрицательного целого числа, 2 -31 для 32-битных дюймов).

Доли со степенью 2 в знаменателе также могут быть представлены точно.

...