(Завершение работы) Чтобы изучить IEEE ошибок с плавающей запятой

Переводы статьи Переводы статьи
Код статьи: 42980 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

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

Дополнительная информация

Десятичные и двоичной системах счисления

Как правило мы подсчитать вещи счисления. Основание является полностью произвольный. Единственная причина, что люди традиционно использовали база 10 является наличие 10 пальцами, которые были сделаны под рукой инвентаризации средства.

532.25 Число в десятичном формате (по основанию 10) означает следующее:
   (5 * 10^2) + (3 * 10^1) + (2 * 10^0) + (2 * 10^-1) + (5 * 10^-2)
       500    +     30     +      2     +     2/10    +    5/100
   _________
   =  532.25
				

В двоичную систему счисления (по основанию 2) каждый столбец представляет питания 2 вместо 10. Например, означает номер 101.01 следующий:
   (1 * 2^2) + (0 * 2^1) + (1 * 2^0) + (0 * 2^-1) + (1 * 2^-2)
       4     +      0    +     1     +      0     +    1/4
   _________
   =  5.25  Decimal
				

Способ представления целых чисел в ПК

Так как нет дробной части в целое число, его машина представление гораздо проще, чем для значений с плавающей запятой. Обычный целые числа персональных компьютеров (ПК), 2 байта (16 бит) длинная с старший бит, показывающее знак. Длинные целые числа, длину 4 байта. Положительные значения являются просто двоичных чисел. Например:
    1 Decimal = 1 Binary
    2 Decimal = 10 Binary
   22 Decimal = 10110 Binary, etc.
				

Тем не менее отрицательные целые числа представляются с помощью двух дополнения схема. Для получения двух дополнения представления отрицательных номер, выполнить двоичное представление для вычисления абсолютного значения числа отразить все биты и добавление 1. Например:
   4 Decimal = 0000 0000 0000 0100
               1111 1111 1111 1011     Flip the Bits
   -4        = 1111 1111 1111 1100     Add 1
				

Обратите внимание, что значение -1 десятичное = 1111 1111 1111 1111 в двоичном формате, который объясняет Почему Basic рассматривает -1 как логическое значение ИСТИНА (все биты = 1). Это следствием отсутствия отдельных оператора побитового и логического сравнение. Часто в Basic, удобно использовать фрагмент кода ниже когда программы будут делать много логических сравнений. Это существенно помогает удобочитаемости.
   CONST TRUE = -1
   CONST FALSE = NOT TRUE
				

Обратите внимание, добавив любую комбинацию двух дополнения номера вместе с помощью обычных двоичной арифметики дает правильный результат.

Трудности с плавающей запятой

Каждый десятичное целое могут быть точно представлены двоичное целое число; Однако это не так для дробных чисел. В действительности каждые номер, который irrational в десятеричной также будет irrational в любом система с основанием меньше 10.

Для двоичного файла, в частности, только дробную номеров, которые могут быть где q является целым числом степень 2, может быть представлено в форме p/q точно так же, выраженное с конечным числом битов.

Даже распространенные десятичные дроби, например, 0,0001, не может быть точно представлены в двоичный файл. (0,0001 — это повторяющиеся двоичные дроби с периодом 104 бита!)

Это объясняет, почему простой пример, такие как
   SUM = 0
   FOR I% = 1 TO 10000
      SUM = SUM + 0.0001
   NEXT I%
   PRINT SUM                   ' Theoretically = 1.0.
				

будет PRINT 1.000054 как выходные данные. Небольшая ошибка представления 0,0001 в двоичном формате распространяется на сумму.

По этой же причине следует всегда соблюдать особую осторожность при внесении Сравнение действительных чисел. В следующем примере показан распространенные ошибки программирования:
   item1# = 69.82#
   item2# = 69.20# + 0.62#
   IF item1# = item2# then print "Equality!"
				

«Равенство!» не будет НАПЕЧАТАНА так, как 69.82 не могут быть представлены точно в двоичной форме, вследствие чего значение, получаемое Назначение СЛЕГКА отличаться (в двоичном формате) превышает значение, т.е. создано выражение. На практике следует всегда кода такие сравнения таким образом, чтобы разрешить некоторые отклонения. Для Пример:
   IF (item1# < 69.83#) AND (item1# > 69.81#) then print "Equal"
				

Это позволит НАПЕЧАТАТЬ «Равно».

IEEE форматирование чисел

QuickBasic для MS-DOS, версия 3.0 поставляется с MBF Версия (Microsoft двоичные операции с плавающей запятой) и IEEE (институт Электрические и электронные инженеров) версии для компьютеров с математический сопроцессор. QuickBasic для MS-DOS версии 4.0 и более поздних версий Используйте только IEEE. Майкрософт выбрала стандарта IEEE для представления значения с плавающей запятой в текущей версии Basic для следующих Существует три основные причины:
  1. Чтобы разрешить Basic использовать математические сопроцессоры Intel, которые используют IEEE формат. Сопроцессоры Intel 80 x 87 серии не может работать с Microsoft двоичный формат чисел.
  2. Чтобы сделать вызов между Basic, C, Pascal, FORTRAN, interlanguage и MASM гораздо проще. В противном случае придется процедуры преобразования использовать для отправки числовые значения с одного языка на другой.
  3. Для достижения согласованности. IEEE это промышленный стандарт для Компиляторы c и FORTRAN.
Ниже приводится краткое сравнение представления IEEE и MBF число двойной точности.
               Sign Bits   Exponent Bits   Mantissa Bits
               ---------   -------------   -------------
   IEEE        1           11              52 + 1 (Implied)
    MBF        1            8              56
				

Дополнительные сведения о различиях между IEEE и MBF представление с плавающей запятой, запрос в Microsoft Knowledge Base на следующие слова:
   IEEE and floating and point and appnote
				

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

Общие понятия с плавающей запятой

Очень важно понимать, что любой двоичной системы с плавающей запятой может представлять только ограниченное число значений с плавающей запятой в точности форма. Все значения должны быть аппроксимируется ближайшие значение, которое может быть представлено. IEEE стандартный способ для Округление значения «ближайший» значение, которое может быть представлено. QuickBasic для MS-DOS поддерживает стандарт и округляет согласно IEEE правила.

Кроме того, имейте в виду, что числа, которые могут быть представлены в IEEE находятся на очень широкий диапазон. Вы можете представить на номер строки. Не существует Высокая плотность номера, которое может быть представлено около 1.0 и -1,0, но меньше и меньше, как перейти к 0 или бесконечность.

Цель стандарт IEEE, который предназначен для проектирования вычисления, — с максимальной точностью (для получения максимально приближены Фактическое число). Точность представляет собой количество цифр, которые можно представить. Стандартный IEEE пытается сбалансировать количество биты, предназначенный для экспоненты с числом битов, используемых для Дробная часть числа, чтобы обеспечить точность и точности в допустимых пределах.

Подробности IEEE

Числа с плавающей точкой представлены в следующую форму, где [степень] — это двоичный показатель степени:
   X =  Fraction * 2^(exponent - bias)
				

[Дробь] — это нормализованное дробную часть числа, нормализовать поскольку показатель корректируется таким образом, чтобы всегда является ведущим бит 1. Таким образом, его не нужно хранить и получать один бит больше точность. Именно поэтому не существует обязательного разряда. Можно представить себе Это подобно экспоненциальное представление чисел, где показатель степени должен иметь одну цифру слева от десятичной запятой, за исключением в двоичном формате, вы всегда показатель степени, таким образом, чтобы первый бит равен 1, поскольку имеется только 1 и 0.

[смещение] — значение смещения, используемое для устранения необходимости сохранения отрицательных показателями.

Смещение для чисел с одинарной точностью — 127 и 1023 (в десятичной системе) для числа двойной точности.

Значения, равные 0 все и всех 1 (двоичный), зарезервированы для представляет особые случаи. Так и других особых случаях указывают на различные условия возникновения ошибок.

Примеры одинарной точности

2 = 1 * 2 ^ 1 = 0100 0000 0000 0000... hex 0000 0000 0000 = 4000
Следует отметить знаковый разряд равен нулю, а хранимая степень имеет значение 128, или 100 1000000 в двоичной форме, которая составляет 127 плюс 1. Хранимая мантисса имеет значение (.) 1000 0000... 0000 0000, имеющий подразумеваемых ведущих 1 и двоичную точку, так что в действительности мантисса имеет значение 1.

-2 = -1 * 2 ^ 1 = 1100 0000 0000 0000... = 0000 0000 C000 0000 hex
Так же, как + 2, за исключением того что бит знака. Это справедливо для всех Числа с плавающей запятой формате IEEE.

4 = 1 * 2 ^ 2 = 0100 0000 1000 0000... hex 0000 0000 0000 = 4080
Та же мантисса, степень увеличивается на единицу (смещенной значение равно 129, или 100 10000001 в двоичной форме.

6 = 1,5 * 2 ^ 2 = 0100 0000 1100 0000... 0000 0000 = 40 C 0 0000 hex
Та же степень мантисса больше на две части — это (1.) 100 0000... 0000 0000, которое, так как это двоичный файл дробь, является 1-1/2 (значения дробных разрядов: 1/2 1/4, 1/8, и т.д.).

1 = 1 * 2 ^ 0 = 0011-1111 1000 0000... = 0000 0000 3F80 0000 hex
Же степени, как другие степени числа 2, мантисса имеет значение 1 меньше, чем 2 на 127, или 01111111 в двоичной форме.

.75 = 1,5 * 2 ^ -1 = 0011 1111 0100 0000... = 0000 0000 3F40 0000 hex
Смещенная степень имеет значение 126, 011 1111 0 в двоичной форме, а мантисса (1.) 100 0000... 0000 0000 — 1-1/2.

2.5 = 1,25 * 2 ^ 1 = 0100 0000 0010 0000... hex 0000 0000 0000 = 4020
Точно так же как 2, за исключением, является бит, который представляет 1/4 Задайте в мантиссе.

0,1 = 1,6 * 2 ^ -4 = 0011 1101 1100 1100... 1100 1101 = 3DCC CCCD hex
1/10 представляет собой повторяющуюся дробь в двоичной форме. Точно так же имеют мантисса 1.6 а Смещенная степень говорит, что 1.6 необходимо разделить на 16 (это 011 1101 1 в двоичной форме, 123 в десятичной системе). ИСТИНА показатель степени является 123-127 = - 4, что означает, что коэффициент, на который умножение — 2 ** -4 = 1/16. Обратите внимание, что Хранимая мантисса округляться в большую сторону в последнем разряде. Это попытка для представления значением номера максимально возможной точностью. (Причины, 1 и 1/10/100 можно точно представить в двоичной форме похож способ 1/3, которое может быть точно не представлено в десятичном формате.)

0 = 1.0 * 2 ^ -128 = нолями--особый случай.

Другие распространенные ошибки с плавающей запятой

Ниже приведены распространенные ошибки с плавающей запятой.
  1. Ошибка округления

    Эта ошибка происходит, когда все биты в двоичное число невозможно использовать в вычислениях.

    Пример: Добавление 0,0001 к 0.9900 (плавающей запятой одинарной точности)

    0,0001 Представляются:
    10100011011011100010111 (1). * 2^(-14+Bias) (13 ведущих 0s в Двоичный)!
    0.9900 представляются:
    11111010111000010100011 (1). * 2^(-1+Bias)
    Теперь для добавления этих чисел, необходимо десятичной точки (двоичный) Выравнивание. Для этого они должны быть Unnormalized. Вот полученный добавлением:
           .000000000000011010001101 * 2^0  <- Only 11 of 23 Bits retained
          +.111111010111000010100011 * 2^0
          ________________________________
           .111111010111011100110000 * 2^0
    
    						
    Это называется ошибки округления, поскольку на некоторых компьютерах округления при Сдвиг для сложения. Другие, просто, усечения. При округлении необходимо принять во внимание при каждом добавлении или умножения двух очень разные значения.
  2. Вычитания двух практически одинаковые значения
           .1235
          -.1234
           _____
           .0001
    
    						
    Это будет преобразовываться. Обратите внимание, что хотя исходные номера Каждая из которых была четыре значащих цифр, результат имеет только один значащей цифрой.
  3. Переполнения и потери точности

    Это происходит, когда результат слишком велико или слишком мало, чтобы быть в виде типа данных.
  4. Quantizing ошибка

    Это происходит с тех номеров, которые не могут быть представлены в точности форма с плавающей запятой стандарта.
  5. Деление на очень небольшое число

    Это может вызвать ошибку «деление на ноль» или может создать неправильный результаты, как показано в следующем примере:
          A = 112000000
          B = 100000
          C = 0.0009
          X = A - B / C
    
    						
    В QuickBasic для MS-DOS X теперь имеет значение 888887, а не правильный ответ 900000.
  6. Ошибка вывода

    Это происходит ошибка при alter функции вывода они работают со значениями.

Свойства

Код статьи: 42980 - Последний отзыв: 1 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Visual Basic 2.0 Standard Edition
  • Microsoft Visual Basic 3.0 Professional Edition
  • Microsoft Visual Basic 1.0 Standard Edition
  • Microsoft Visual Basic 2.0 Professional Edition
  • Microsoft BASIC Professional Development System 7.0
Ключевые слова: 
kbmt KB42980 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:42980
Заявление об отказе относительно содержимого статьи о продуктах, поддержка которых прекращена
Эта статья содержит сведения о продуктах, поддержка которых корпорацией Майкрософт прекращена. Поэтому она предлагается как есть и обновляться не будет.

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com