Рубрики
Без рубрики

Что случилось с плавающей точкой?

Я предполагаю, что большинство людей, читающих, это использовали номера с плавающей точкой в какой-то момент, часто не интенсио … Теги с программированием, учебником, начинающими, Python.

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

Я также довольно уверен, что хороший номер, кто есть столкнулся с ними сделал так после попытки обнаружить, почему результат Простые вычисления неверны Отказ НАПРИМЕР.

0.1 + 0.2
// result: 0.30000000000000004
// Which I'm fairly sure
// should be 0.3 ...

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

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

Почему мы даже нуждаемся в плавающей точке 🤔?

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

Я надеюсь, что большинство людей читают это, знакомы с двоичными числами в какой-то форме; Если нет, рассмотрим чтение этого блога по почте Линда Вивах Отказ

Но как насчет десятичных? Фракции, π, Реальные номера ?

Для Любой полезный Вычисление, нам нужны компьютеры, чтобы иметь возможность представлять следующие:

  • Очень Очень Очень Очень Маленький числа,
  • Очень Очень Очень Очень Большой числа,
  • Все между ними!

Начиная с самого Очень Очень Очень Маленький числа, чтобы взять нас в правильном направлении; Как мы их храним?

Ну, это просто. Мы храним те, которые используют эквивалентное десятичное представление в двоичном …

Двоичные фракции

Пример должен помочь здесь. Давайте выберем случайную двоичную фракцию: 101011.101

Это очень похоже на то, как работают десятичные числа. Единственное отличие в том, что у нас есть база 2 вместо базы 10 Отказ Если патрон выше в двоичном преобразователе вашего выбора, вы обнаружите, что это верный!

Так как мы можем хранить эти двоичные фракции?

Скажем, мы выделите один байт (8 бит) для хранения нашей двоичной дроби: 00000000 Отказ Затем мы должны выбрать место, чтобы поставить наши Двоичный разделитель Так что мы можем иметь дробную часть нашего двоичного номера.

Давайте попробуем чмокать взрыв в середине!

0000.0000

Какое самое большое количество мы можем представлять с этим?

1111.1111 = 15.9375

Это … не очень впечатляет. Ни нашему наименьшее число, которое мы можем представлять, 0,00625 Отказ

Есть много из потраченного места для хранения здесь рядом с низким диапазоном возможных чисел. Проблема в том, что выбирая любое место, чтобы поставить наши точка оставил нас с либо Фракционная точность или А большее целое число Диапазон – не оба.

Если бы мы могли просто двигаться дробь точка вокруг, как нам нужно, мы могли бы получить намного больше из нашего ограниченного хранения. Если только точка мог бы плавать вокруг, как нам нужно это, а плавающая точка если вы будете…

(Извините, мне пришлось 😅.)

Так Что такое плавающая точка?

Плавающая точка – это именно то, что плавающее ( дробное ) точка Номер, который дает нам возможность изменить относительный размер нашего числа.

Так как мы математически представляем номер таким образом, чтобы мы,

  1. Храните значительные цифры числа, которые мы хотим представлять (Например, 12 в 0,00000012) ;
  2. знаю, где поставить дробную точку в отношении значительных цифр (Например, все 0 в 0,00000012) ?

Чтобы сделать это, давайте время путешествовать (для некоторых) обратно в среднюю школу …

Стандартная форма (научная запись)

Кто-нибудь помнит Mathsisfun. ? Я как-то чувствую себя старым прямо сейчас, но в любом случае, это с их сайта:

Вы можете сделать точный То же самое с двоичным! Вместо 7 * 1 0 2 = 700 7 * 10 ^ 2 7 * 1 0 2 = 7 0 0 , Мы можем написать

Который эквивалентен 175 * 4 = 700 175 * 1 7 5 * 4 = 7 0 0 Отказ Это отличный способ представлять номер на основе Значительные цифры и Размещение дробной точки относительно указанных цифр.

Вот и все! Плавающая точка – это бинарная стандартная форма представления чисел.

Если мы хотим немного оформить представительство, нам нужно объяснить позитивные и Отрицательные числа. Для этого мы также добавляем знак на наше число, умножив на ± 1:

И вернуться к примеру, данной Mathsisfun …

Если вы читаете другую литературу, вы найдете представление будет выглядеть что-то вроде …

Где S s S это знак подписания, C слияние C Это показатель/мантисса, B B B это база, а е е е это показатель.

Так почему я получаю странные ошибки 😡?

Итак, мы знаем, что сейчас с плавающей точкой. Но почему я не могу сделать что-то простое, как добавить два числа вместе без риска ошибки?

Ну проблема лежит частично с компьютером, но в основном с сама математика Отказ

Повторяющиеся фракции

Редакционные фракции представляют собой интересную проблему в системах представления номеров.

Давайте выберем любую фракцию x y \ frac {x} {y} y х . Если y y y имеет Основной фактор это не так фактор базы это будет повторяющаяся фракция.

Вот почему цифры, как 1 / 21 1/21 1 / 2 1 не может быть представлено в конечном количестве цифр; 21 21 2 1 есть 7 7 7 и 3 3 3 как главные факторы, ни один из которых не являются фактором 10 10 1 0 Отказ

Давайте поработаем через пример в десятичных.

Десятичный

Скажем, вы хотите добавить номера 1 / 3 1/3 1 / 3 и 2 / 3 2/3 2 / 3 . Мы все знаем ответ – это 42 1 1 1 , но если мы работаем в десятичном периоде, это не так очевидно.

Это потому, что 1 / 3 = 0.333333333333… 1/3.333333333333… 1 / 3 = 0 . 3 3 3 3 3 3 3 3 3 3 3 3 . . .

Это не число, которое можно представить как Конечное количество цифр в десятичном. Как мы не можем хранить бесконечные цифры, мы храним приближение точное до 10 мест Отказ

Расчет становится …

Конечная природа, в которой мы можем хранить номера, не хорошо сетка с неизбежным фактом, что мы не может легко представлять все номера в конечном количестве цифр Отказ

Двоичный

Эта той же проблема возникает в двоичном, За исключением еще хуже! Причина этого в том, что 2 2 2 имеет один менее главный фактор, чем 10 10 1 0 а именно 5 5 5 Отказ

Из-за этого повторяющиеся фракции случаются более распространены в базе 2 2 2 Отказ

Пример этого – 0,1 0,1 0 Отказ 1 :

В десятичных случаях это легко. В двоине однако … 0,00011001100110011 ... , это еще одна повторяющаяся фракция!

Так что пытаюсь выполнить 0,1 + 0,2 становится

  0.0001100110011
+ 0.0011001100110
= 0.0100110011001
= 0.299926758

Теперь, прежде чем мы получили что-то похожее на 0.30000000004 это из-за таких вещей, как Режимы округления Который я не пойду сюда (но сделаю это в будущем посте). Тот же принцип вызывает этот вопрос.

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

Точность

Другой главный вопрос приходит в виде Точность Отказ

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

Десятичный

В качестве примера считают, что у нас есть три Десятичная Значения для хранения наших значительных цифр.

Если сравнивать 333 333 3 3 3 и 1 / 3 * 1 0 3 1/3 * 10 ^ 3 1 / 3 * 1 0 3 мы обнаружили, что в нашей системе они Точно так же Отказ

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

В крайнем примере добавляют 1 1 1 к 1 * 1 0 3 1 * 10 ^ 3 1 * 1 0 3 приведет к 1 * 1 0 3 1 * 10 ^ 3 1 * 1 0 3 номер не изменился Отказ Это потому, что вам нужно Четыре Значимые цифры для представления 1001 1001 1 0 0 1 Отказ

Двоичный

Этот точно такой же проблема встречается в двоичном счете с очень Очень Очень Очень небольшой и очень Очень Очень Очень Большой числа. В будущем пост я расскажу больше о пределах с плавающей точкой.

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

Используя базу 2 вместо этого, 1 * 2 ^ 3 , добавляя 1 нашему количеству приведет к отсутствию изменения. Это потому, что представлять 1001 (теперь эквивалентно 9 в десятичном периоде) требует 4 бита, менее значительный Двоичные цифры – потерян в переводе Отказ

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

  • НАПРИМЕР. Перейти от одинокий -Поломный номер с плавающей запятой для Двойной -Магазин с плавающей запятой.

Резюме

TLDR

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

Это позволяет нам хранить Большой и Маленький Числа с точностью.

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

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

Спасибо 🥰!

Большое спасибо за чтение! Я надеюсь, что это было полезно для тех, которые нуждались в небольшой препарате на плавающей точке, а также тем, которые являются новыми для этой концепции.

Я сделаю один или два обновления на этот пост, объясняющий глубину IEEE 754-2008 Стандарт с плавающей точкой Так что, если у вас есть такие вопросы:

  • ” Каковы самые большие и самые маленькие числа, которые я могу использовать в плавающей точке? »
  • ” Что делают финансовые учреждения с этими ошибками?
  • ” Можем ли мы использовать другие основы? »
  • «Как мы на самом деле выполнить арифметику с плавающей точкой?»

Тогда не стесняйтесь следовать, чтобы увидеть обновление! Вы также можете следовать за мной в Twitter @tim_cb_roderick Для обновлений. Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь оставить комментарий ниже.

Оригинал: “https://dev.to/timroderick/what-s-up-with-floating-point-o8l”