#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» является неявным. И я смутно припоминаю некоторые странности, когда показатель равен единицам.