В настоящее время вы работаете в автономном режиме; ожидается повторное подключение к Интернету

Браузер не поддерживается

Чтобы использовать веб-сайт, обновите браузер.

Обновите браузер до последней версии Internet Explorer

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

ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.

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

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

Как правило мы подсчитать вещи счисления. Основание является полностьюпроизвольный. Единственная причина, что люди традиционно использовали база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 функции вывода они работают со значениями.
1,00 2,00 3.00 4.00 4.00b 4.50 6.00 6.00b 7.00 7.10 IEEETUTR

Внимание! Эта статья переведена автоматически

Свойства

Номер статьи: 42980 — последний просмотр: 06/01/2011 08:22:00 — редакция: 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
Отзывы и предложения