Примеры погрешности с плавающей точкой

Как Вы объясняете погрешность с плавающей точкой новым программистам и неспециалистам, которые все еще думают, что компьютеры бесконечно мудры и точны?
У Вас есть любимый пример или история, которая, кажется, объясняет идею намного лучше, чем точное, но сухое, объяснение?
Как это преподается в занятиях по Информатике?

29
задан 4 revs, 3 users 57% 24 April 2010 в 22:34
поделиться

4 ответа

Существует в основном два основных подводных камня, которые натыкаются с числами с плавающей точкой.

  1. Проблема масштаба. Каждый номер FP имеет экспонент, который определяет общую «масштаб» числа, чтобы вы могли представлять собой действительно маленькие значения, либо на самом деле большие больные, хотя количество цифр, которые вы можете посвятить для этого ограничен. Добавление двух чисел разных масштабов иногда приведет к меньшему количеству «съеденного», поскольку нет способа вписать его в большую масштаб.

     PS> $ a = 1;  $ b = 0,0000000000000000000000000000000000000000001
    PS> PROCE-HOSTE A = $ A B = $ B
    A = 1 B = 1E-25
    PS> $ A + $ B
    1.
     

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

    (Если люди учатся у этого возникли проблемы с экспоненциальной записью, можно также использовать значения 1 и 1000000000000000000000000 или около того.)

  2. Тогда возникает проблема двоичных против десятичного представления. НОМЕР, как 0,1 , не может быть представлено точно с ограниченным количеством двоичных цифр. Некоторые языки маскируют это, хотя:

     PS> "{0: n50}" -F 0.1
    0.10000000000000000000000000000000000000000000000000000000000000000000000000.
     

    Но вы можете «усилить» ошибку представления, повторно добавляя номера вместе:

     PS> $ SUM = 0;  для ($ i = 0; $ i -lt 100; $ i ++) {$ sum + = 0,1};  сумма
    9 9999999999998
     

    Я не могу придумать хорошую аналогию, чтобы правильно объяснить это. Это в основном та же проблема, почему вы можете представлять 1 / 3 только примерно в десятичных случаях, потому что для получения точного значения необходимо повторить 3 неопределенно в конце десятичной дроби.

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

  3. Тогда есть еще одна проблема, хотя большинство людей не наткнутся на это, если они не делают огромные количества численного материала. Но тогда те, кто уже знают о проблеме. Поскольку многие номера с плавающей точкой являются просто приближения точного значения, это означает, что для данного приближения f реального числа R может быть бесконечно много более действительных чисел 1 , R 2 , ... какая карта точно такое же приближение. Эти цифры лежат в определенном интервале. Допустим, R мин - минимально возможное значение R , что приводит к f и R MAX Максимально возможное значение R , для которого это удерживает, то у вас есть интервал [ R min , R max ] Где любое число в Этот интервал может быть вашим фактическим числом R .

    Теперь, если вы выполняете расчеты на это добавление номера, вычитание, умножение и т. Д. - Вы теряете точность. Каждое число - это просто приближение, поэтому вы фактически выполняете расчеты с интервалами . Результатом также является интервал, и ошибка аппроксимации только что-либо становится больше, тем самым расширяя интервал. Вы можете вернуть одно число из этого расчета. Но это просто один номер из интервала возможен результаты результатов, с учетом точности ваших исходных операндов и прецизионной потери из-за расчета.

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

26
ответ дан 28 November 2019 в 01:43
поделиться

Как это для объяснения ключей. Односторонние компьютеры представляют номера, подсчитав дискретные единицы. Это цифровые компьютеры. Для целых чисел, те, кто без дробной части, современные цифровые компьютеры считают мощности двух: 1, 2, 4, 8., поместите значение, двоичные цифры, бла, бла, бла. Для фракций цифровые компьютеры считают обратные мощности двух: 1/2, 1/4, 1/8, ... Проблема в том, что многие цифры не могут быть представлены суммой конечного числа этих обратных сил. Используя больше значений места (больше битов), увеличит точность представления этих «проблемных» чисел, но никогда не получают его точно, потому что он имеет только ограниченное количество битов. Некоторые цифры не могут быть представлены с бесконечным количеством битов.

Snooze ...

Хорошо, вы хотите измерить громкость воды в контейнере, а у вас есть только 3 измерительные чашки: полная чашка, получарка и четверть чашки. После подсчета последней полной чашки, скажем, есть треть оставшихся чашки. Тем не менее, вы не можете измерить это, потому что он точно не заполняет никакой комбинации доступных чашек. Он не заполняет пол чашки, а переполнение из четверть чашки слишком мала, чтобы заполнить что-либо. Таким образом, у вас есть ошибка - разница между 1/3 и 1/4. Эта ошибка усугубляется, когда вы объедините его с ошибками из других измерений.

6
ответ дан 28 November 2019 в 01:43
поделиться

В питоне:

>>> 1.0 / 10
0.10000000000000001

Объяснить, как некоторые фракции не могут быть точно представлены в двоичном виде. Точно так же, как некоторые фракции (например, 1/3) не могут быть точно представлены в базе 10.

2
ответ дан 28 November 2019 в 01:43
поделиться

Ваше придется сопоставить текстуру к сфере Тогда, как вы сказали. Но AFAIK Silverlight 3 не поддерживает аппаратное обеспечение ускоренного 3D.

Итак, ваши варианты:

  • попробуйте найти программное обеспечение Silverlight Software 3D (, как это )
  • Написать свой собственный программный раститель ( Multi Page Guide)

Надеюсь, это помогает

-121--3747475-

показывают, что система Base-10 страдает от точно та же проблема.

Постарайтесь представить 1/3 в качестве десятичного представления в базе 10. Вы не сможете это сделать точно.

Так что, если вы пишете «0,3333», у вас будет достаточно точное представление для многих случаев использования.

Но если вы переместите это обратно к фракции, вы получите «3333/10000», что не так же, как «1/3».

Другие фракции, такие как 1/2, могут быть легко представлены конечным десятичным представлением в базе-10: «0,5»

теперь Base-2 и Base-10 страдают по существу одинаковой проблемы: оба имеют некоторые числа что они не могут точно представлять.

В то время как Base-10 не имеет проблем, представляющих 1/10 как «0,1» в базе-2, вам понадобится бесконечное представление, начиная с «0,000110011.» ..

8
ответ дан 28 November 2019 в 01:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: