2016-01-31 3 views
2

Название в значительной степени суммирует все.Расчет диапазона поплавка в C

Я знаю, что поплавки имеют 32-битную сумму с 23 битами для мантиссы и 8 бит для показателя экспоненты и 1 для подписания.

Расчет диапазона "ИНТ" довольно прост: 32бит = 32-1bit подпись = 31bits ==> Диапазон поэтому 2³¹ = 2.14e9

формула имеет смысл ...

Теперь я Я посмотрел на stackoverflow, но все ответы, которые я нашел в расчетах с плавающей точкой, не содержали вещества. Просто пучок чисел, появляющихся случайным образом в ответах и ​​магически достигая заключения 3.4e38.

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

Спасибо всем.

Мо

+1

[Попробуйте эту страницу] (https: //en.wikipedia.org/wiki/Single-precision_floating-point_format) –

+0

https://en.wikipedia.org/wiki/Single-precision_floating-point_format –

+1

«Знайте, что поплавки всего 32 бит ...» Вы знаете неправильно. Даже для типа 'float' это не обязательно верно. В стандарте C не применяется конкретный формат или размер, а также минимальные требования. И для 'double', который окончательно ошибочен. Для 'int' вы также ошибаетесь. В большинстве систем на самом деле используется 16-битный 'int'. – Olaf

ответ

1

C не определяет float, как описано ОП. Один из предложенных OP: binary32, самый популярный, является одним из многих соответствующих форматов.

Что C действительно определяет

5.2.4.2.2 Характеристики плавающих типов

s sign (±1) 
b base or radix of exponent representation (an integer > 1) 
e exponent (an integer between a minimum emin and a maximum emax) 
p precision (the number of base-b digits in the significand) 
fk nonnegative integers less than b (the significand digits) 

x = s*power(b,e)*Σ(k=1, p, f[k]*power(b,-k)) 

Для binary32, максимальное значение

x = (+1)*power(2, 128)*(0.1111111111 1111111111 1111 binary) 

x = 3.402...e+38 

Учитывая 32- бит для определения float многих других возможностей х годов. Пример: A float может существовать так же, как binary32, но не поддерживает бесконечность/не-число. Листы других экспонентов доступны номера. Максимальное значение - 2*3.402...e+38.


binary32 описывает его значение до 1.11111 ... двоичное. Вышеуказанная формула C имеет значение до 0,111111 ...

+0

Разве это не' 1.1111111111 1111111111 111'? Самый высокий бит мантиссы подразумевается 1. Ваша версия дает только «1.701e + 38». –

+0

@ Wheather Vane Измененный ответ. 'Emax' формулы:' Emax + 1' из [wiki page] (https://en.wikipedia.org/wiki/Single-precision_floating-point_format#Exponent_encoding). Примечание: Значения C начинаются с 'power (base, -1)'. То же самое - просто разные способы выразить это. – chux

+0

Ну, эта ссылка говорит 'Emax = FEH-7FH = 127' –

0

С использует одинарную точность с плавающей точкой обозначения, что означает, что 32-битная плавающая точка имеет 1 бит для знака, 8 бит для экспоненты и 23 бита для мантиссы. Мантисса рассчитывается путем суммирования каждого бита мантиссы * 2^(- (бит_индекс)). Показатель рассчитывается путем преобразования 8-битного двоичного числа в десятичное число и вычитания 127 (таким образом, вы также можете иметь отрицательные показатели), а бит знака указывает, отрицательный или нет. Формула такова:

(-1)^S * 1.M * 2^(E - 127) 

Где S есть знак, М мантисса, и Е обозначает показатель степени. См. https://en.wikipedia.org/wiki/Single-precision_floating-point_format для лучшего математического объяснения.

Чтобы ответить на ваш вопрос, это означает, что для 32-битного поплавка наибольшее значение составляет (-1)^0 * 1.99999988079071044921875 * 2^128, что составляет 6.8056469327705771962340836696903385088 × 10^38 согласно Wolfram. Наименьшее значение является отрицательным.