2016-10-27 3 views
1

Хотя Excel использует стандартный бинарный формат IEEE754, он не использует те же правила для арифметики и сравнений, например.Спецификация поведения с плавающей запятой Excel

=0.1+0.2=0.3 

возвращение TRUE и otherexamples.

Является ли точное поведение документированным в любом месте?

+0

Мне это известно только по этой ссылке. https://support.microsoft.com/en-us/kb/78113 Какие сведения о некоторых проблемах несоответствия со стандартом IEEE. В нижней части этой страницы есть ссылка, которая добавляет немного больше (но не так много). –

ответ

1

Эта документация тангенциально решает эту проблему:

https://support.microsoft.com/en-us/kb/78113

Смотрите особенно:

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

Если применить эту «оптимизацию» на разницу между 0.1 + 0.2 и 0.3 он, по-видимому, превращается в 0, что означает, что они не следуют стандартам строго.

0

Сделав несколько экспериментов, я установил следующее поведение:

  1. два значения «равны» в соответствии с оператором равенства (=), если они равны 15 значащих десятичных цифр (т.е. "%.14e" в Printf жаргон)

    • меньше (<) и меньше или равно (<=) определяется в соответствии с этим (т.е. «Excel меньше, чем» истинно, если оно истинно IEEE арифметики, и вал ues не равны «Excel»).
  2. , если последний оператор (в соответствии с обычным оператором старшинства) в формуле клеточной - или +, а величина результата составляет менее 8 ulps (единиц в последнем месте) первого аргумента, то результат будет равен нулю.

    • Это поведение может быть подавлено путем обертывания всего выражения в круглых скобках (или, что то же самое, вы можете рассматривать такие скобки для скобок как оператор).
  3. SUM-видимому, действует таким же образом, как прикованная последовательность + (порог, как представляется, 8 ulps второго последнего элемента накопленной суммы), но усечение не может быть подавлен с помощью оберточных скобок.

Обратите внимание, что они несовместимы, поскольку эти значения могут быть «Excel равными», но имеют отличную от нуля разницу и наоборот.

Поэтому, если вы хотите что-то ближе к IEEE арифметику в Excel:

  • обруча все формулы в окончательном скобках

  • использование (a-b)<0 вместо a<b (и аналогично для других логических операторов)

  • избегать использования SUM

(это все равно не будет строгим из-за отсутствия субнормальных сигналов и подписанных нулей)

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