представление дроби в с ++ - PullRequest
0 голосов
/ 10 ноября 2018

дроби (0.9) и (0.2) делают ошибку усечения при представлении в плавающем или двойном так что если мы представим 0,9 или 0,2 два раза:

  • первый в переменной с плавающей точкой
  • второй в двойной переменной
  • это значит, что один из них больше другого, а самая большая - двойная переменная

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

почему этот код напечатан («Положительный»)

float afloat = 0.9;  

if      ( 0.9 - afloat >  0 ) cout << "Positive" << endl;
else if ( 0.9 - afloat == 0 ) cout << "Equal"    << endl;
else if ( 0.9 - afloat <  0 ) cout << "Negative" << endl;

пока этот код напечатан («Негативный») ??

float afloat = 0.2;  

if      ( 0.2 - afloat >  0 ) cout << "Positive" << endl;
else if ( 0.2 - afloat == 0 ) cout << "Equal"    << endl;
else if ( 0.2 - afloat <  0 ) cout << "Negative" << endl;

1 Ответ

0 голосов
/ 11 ноября 2018

Литерал 0.9 является приближением значения двойной точности к 9/10, и ваша декларация

float afloat = 0.9

усекает это значение с одинарной точностью, тем самым теряя информацию.Этот код

float afloat = 0.9f;  

if      ( 0.9f - afloat >  0 ) cout << "Positive" << endl;
else if ( 0.9f - afloat == 0 ) cout << "Equal"    << endl;
else if ( 0.9f - afloat <  0 ) cout << "Negative" << endl;

будет генерировать вывод

Equal

, даже если 0.9f точно не равен дроби 9/10.Знак ошибки квантования будет отличаться для разных дробей и для разных форматов с плавающей запятой.

...