странный вывод по сравнению с плаванием с литералом плавающим

Другое соображение является кодом выхода для возврата. Просто" 1" является довольно стандартным, хотя существует горстка зарезервированные коды выхода, которые колотят себя использование , и та же самая страница утверждает, что пользовательские коды должны быть в диапазоне 64-113 для приспосабливания стандартам C/C++.

Вы могли бы также рассмотреть подход битовый вектора что mount использование для его кодов выхода:

 0  success
 1  incorrect invocation or permissions
 2  system error (out of memory, cannot fork, no more loop devices)
 4  internal mount bug or missing nfs support in mount
 8  user interrupt
16  problems writing or locking /etc/mtab
32  mount failure
64  some mount succeeded

OR - луг коды вместе позволяет Вашему сценарию сигнализировать о нескольких одновременных ошибках.

34
задан Bo Persson 14 August 2012 в 16:48
поделиться

2 ответа

Это происходит потому, что в вашем операторе

  if(f == 0.7)

0,7 рассматривается как двойное. Попробуйте 0.7f, чтобы убедиться, что значение обрабатывается как число с плавающей запятой:

  if(f == 0.7f)

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

50
ответ дан 27 November 2019 в 16:26
поделиться

Этот ответ дополняет существующие: обратите внимание, что 0,7 не может быть точно представлен ни как float (или как double). Если бы он был представлен точно, то не было бы потери информации при преобразовании в float, а затем обратно в double, и у вас не было бы этой проблемы.

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

Все нецелые числа, которые могут быть представлены в точности, имеют последнюю десятичную цифру 5 . К сожалению, обратное неверно: некоторые числа имеют последнюю десятичную цифру 5 и не могут быть представлены точно. Маленькие целые числа могут быть представлены точно, а деление на степень 2 преобразует число, которое может быть представлено, в другое, которое может быть представлено, пока вы не входите в область денормализованных чисел.

14
ответ дан 27 November 2019 в 16:26
поделиться