C ++ не усекает дубли? - PullRequest
       143

C ++ не усекает дубли?

0 голосов
/ 09 октября 2018

Мой код :

Результат выполнения следующего кода:

#include <cstdio>

//i define printBits elsewhere but that's not relevant to my question
void printBits(const float f);
void printBits(const double f);

int main(int argc, char **argv) {
  float f=4.2;
  double d=4.2;
  printf("float: %20.20f\n",f);
  printBits(f);
  printf("double: %50.50f\n",d);
  printBits(d);

 return 0;
}

Is:

float: 4.19999980926513671875
0    10000001 00001100110011001100110

double: 4.20000000000000017763568394002504646778106689453125
0 10000000001 0000110011001100110011001100110011001100110011001101

Обратите внимание, как я установили f и d до 4,2, но значение с плавающей запятой немного меньше 4,2, а двойное значение немного больше 4,2.Я понимаю, почему значение с плавающей запятой меньше 4,2;значение 4.2 усекается до значения ~ 2 ^ -21 меньше, чем 4.2.Однако я не понимаю, почему значение double немного больше , чем 4.2.Я думал, что значения типа float и double будут просто усекаться, но кажется, что значение double округляется вверх, а не вниз.

В общем случае, значения типа float и double округляются до ближайшего представимого значения?Разве плавает и удваивается по-разному?Я пытался найти это, но не смог найти ничего подходящего.

1 Ответ

0 голосов
/ 09 октября 2018

Значения с плавающей запятой не усечены , они округлены до ближайшего представимого значения.Вы обнаружили интересный пример, когда округление идет в другом направлении в зависимости от размера с плавающей запятой, но это не редкость;Вы можете ожидать, что округление будет увеличиваться примерно в 50% случаев, а в 50% - при небольшом количестве значений, которые будут точно представлены и не будут округлены вообще.Например, 4.25 будет точным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...