2016-04-20 21 views
0

Я пытаюсь выяснить, как работают поплавки и удвоения на C, но я запутался на многих уровнях. Вот мои вопросы:C: Точность поплавка, диапазон, отрицательные значения

  1. В моей книге говорится, что максимальное значение поплавка 10^38. Тем не менее, это точно только до 10^10. При 10^11 компьютер дает мне приблизительное значение, а не точное значение. Откуда этот предел точности, и почему он не упоминается?

  2. Какова точка назначения максимального диапазона 10^38, если это неточно?

  3. int и float оба занимают 4 байта памяти, но они имеют разные диапазоны. Почему это?

  4. Диапазон поплавка 10^-38 до 10^38, но отрицательные значения возможны. Зачем?

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

+2

Это не так много вопросов на C/C++, поскольку это общий вопрос с плавающей точкой. – SergeyA

+0

Порекомендуйте взглянуть на [Неисправна ли плавающая пинта] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken), особенно ответ, полученный с точки зрения аппаратного обеспечения. –

+1

Я предлагаю прочитать https://en.m.wikipedia.org/wiki/IEEE_floating_point –

ответ

3

Я попытаюсь ответить в общем, без особых подробностей и без привязки к стандарту с плавающей точкой. Если вас это интересует, вы должны ознакомиться с стандартом IEEE 754 с плавающей запятой - сложной задачей. В то время как реализации C/C++ не обязаны следовать за ним, они обычно делают это, и это авторитетный источник, заслуживающий понимания для кого-то, глубоко заинтересованного в этой теме.

Прежде всего, в целом числа с плавающей запятой представлены как две отличительные части - значительное число и показатель. Это легко понять для тех, кто знаком с научной нотацией. В научной нотации 42.42 может быть представлен как 4242 * 10^-2. (Где ^ -2 означает 10 к мощности -2.) Здесь 4242 является так называемым значащим числом, -2 является показателем степени и 10 является базой экспоненты.

Такая же идея может быть закодирована в двоичном представлении. Вы просто просматриваете некоторые биты, чтобы выразить значительную часть, некоторые биты для выражения экспоненты и некоторые биты, чтобы выразить базу (или по умолчанию вашу базу).

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

[5 бит, чтобы указать, сколько битов для значительных] [2 бита для кодирования базы] [значащих бит] [ экспоненциальные биты]

И эта схема позволяет кодировать гораздо большие числа, чем целые кодировки, в том же количестве бит. Потенциально, с 32-битной схемой и выше, можно кодировать числа до 10^(2^25)! Многое гораздо больше, чем одно, представленное простым 32-битным целым!

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

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

+0

Замечательное объяснение, спасибо большое! Теперь логика действительно имеет смысл для меня. :) – Lobs001

0

Просто прочитайте страницу википедии. Он отвечает на ваши вопросы отлично here

+0

Спасибо, я думаю, что первый абзац говорит мне самое важное для меня прямо сейчас; что это компромисс между точностью и дальностью. – Lobs001

+0

Статья Википедии по этому вопросу, по сути, ужасная. – SergeyA

0

1) Это дает вам приблизительное значение из-за того, «как они представлены внутри». Is floating point math broken?

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

3) Различный диапазон, потому что у них разные Представление. См. Это Size of int and float.

4) См. this.

+0

для 4-го я не мог получить лучшего объяснения. Если кто-нибудь знает лучше, пожалуйста, помогите. Заранее спасибо. –

+0

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

+0

спасибо за указание, что я на самом деле имел в виду машину или систему, которую мы используем. Я исправлю его –

Смежные вопросы