Самая большая представимая точка с плавающей запятой / крошечная ошибка в «Что каждый специалист по информатике должен знать об арифметике с плавающей запятой».

#language-agnostic #floating-point

#не зависит от языка #плавающая точка

Вопрос:

Я полагаю, что в статье «Что каждый специалист по информатике должен знать об арифметике с плавающей запятой» есть крошечная ошибка.

В нем утверждается, что

Менее распространенная ситуация заключается в том, что действительное число выходит за пределы диапазона, то есть его абсолютное значение больше, чем
http://img219.imageshack.us/img219/7396/screenshot2011052714105.png http://img219.imageshack.us/img219/7396/screenshot2011052714105.png .

Это почти точно, максимальное представимое число с плавающей запятой немного меньше этого, а действительное число выходит за пределы диапазона, когда оно больше, чем
http://img707.imageshack.us/img707/9236/screenshot2011052714045.png http://img707.imageshack.us/img707/9236/screenshot2011052714045.png

Верно?

Комментарии:

1. Возможно, «больше, чем» должно быть «больше, чем или равно».

2. Да, это тоже было бы правильно, но не так точно.

3. Мне кажется правильным. Кроме того, вы можете исключить 1 из своего выражения, если вы просто заставите сумму начинаться с i=0 .

4. Подождите, это неправильно. Бета — это база, верно? Так, например, если бета = 10, вам нужно число, подобное .9999 * 10 ^ n. Я думаю, вам нужен коэффициент (бета-1) в вашей сумме.

Ответ №1:

Меня не беспокоят изображения, поэтому я напишу b для «beta» и m для «e_max».

Итак, скажем, b — это основание, p — точность, а m — максимальный показатель.

Тогда я думаю, что выражение, которое вы хотите, это:

 (1 - b^(-p)) * b^m
  

Например, для базового значения 10 с точностью 4 цифры и максимальным показателем 12 это дает:

 .9999 * 10^12
  

…что правильно.

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