Я попытаюсь ответить в общем, без особых подробностей и без привязки к стандарту с плавающей точкой. Если вас это интересует, вы должны ознакомиться с стандартом IEEE 754 с плавающей запятой - сложной задачей. В то время как реализации C/C++ не обязаны следовать за ним, они обычно делают это, и это авторитетный источник, заслуживающий понимания для кого-то, глубоко заинтересованного в этой теме.
Прежде всего, в целом числа с плавающей запятой представлены как две отличительные части - значительное число и показатель. Это легко понять для тех, кто знаком с научной нотацией. В научной нотации 42.42
может быть представлен как 4242 * 10^-2
. (Где ^ -2
означает 10 к мощности -2.) Здесь 4242
является так называемым значащим числом, -2 является показателем степени и 10 является базой экспоненты.
Такая же идея может быть закодирована в двоичном представлении. Вы просто просматриваете некоторые биты, чтобы выразить значительную часть, некоторые биты для выражения экспоненты и некоторые биты, чтобы выразить базу (или по умолчанию вашу базу).
В сущности, двоичное представление числа с плавающей точкой может выглядеть примерно так:
[5 бит, чтобы указать, сколько битов для значительных] [2 бита для кодирования базы] [значащих бит] [ экспоненциальные биты]
И эта схема позволяет кодировать гораздо большие числа, чем целые кодировки, в том же количестве бит. Потенциально, с 32-битной схемой и выше, можно кодировать числа до 10^(2^25)! Многое гораздо больше, чем одно, представленное простым 32-битным целым!
Однако у него есть его расходы. Чем больше (по модулю) или ближе к нулю число становится, тем больше бит используется для экспоненты (для обозначения большой мощности!), А меньшее количество бит посвящено значительным.Но с этим вы неизменно теряете точность - просто потому, что есть (очень) конечное число чисел, которые могут быть представлены, например, из восьми бит.
Это почти суммируется. Остальное - это правила для создания чисел, выбора базы и экспонентов, округления представления и т. Д.
Это не так много вопросов на C/C++, поскольку это общий вопрос с плавающей точкой. – SergeyA
Порекомендуйте взглянуть на [Неисправна ли плавающая пинта] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken), особенно ответ, полученный с точки зрения аппаратного обеспечения. –
Я предлагаю прочитать https://en.m.wikipedia.org/wiki/IEEE_floating_point –