Алгоритмы с плавающей запятой в C

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

Я могу кое-что предположить об этом, но это немного неясно. Я знаю, что фиксированную точку можно получить, разделив 4-байтовое целое число сигнальным флагом, основанием и мантиссом. При этом у нас есть 1-битный флаг, 5-битная система счисления и 10-битная мантисса. Слово из 32 бит идеально подходит для значения с плавающей запятой :)

Чтобы сделать сложение между двумя числами с плавающей запятой, я могу просто попытаться добавить две мантиссы и добавить перенос в 5-битную систему счисления? Это способ выполнить математику с плавающей запятой (или математику с фиксированной запятой, если быть правдой), или я совершенно не прав?

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


person Leandro Jardim    schedule 07.07.2010    source источник
comment
Почему вы пытаетесь написать новые функции с плавающей запятой вместо того, чтобы просто использовать функции из стандартной математической библиотеки?   -  person Daniel Pryden    schedule 08.07.2010
comment
Я согласен, что он должен сделать. Тем не менее, нет ничего плохого в желании узнать, как это работает. Таких людей должно быть больше.   -  person T.E.D.    schedule 08.07.2010
comment
@Daniel Потому что он хочет учиться? По сути, во всех упражнениях на языке программирования C от K&R вы реализуете общие утилиты Unix.   -  person Tyler    schedule 08.07.2010
comment
Я хочу узнать все, что могу, о внутренней работе микропроцессоров. Я хочу быть инженером. Я хочу поместить эти функции в крошечную виртуальную машину, которую я имею в виду. Было бы очень здорово увидеть, как он работает и вычисляет вещи без использования специализированного оборудования.   -  person Leandro Jardim    schedule 08.07.2010


Ответы (3)


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

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

Значение (x) = мантисса * основание ^ показатель степени

adding these two numbers

    101011 * 2 ^ 13
    001011 * 2 ^ 12

would be the same as adding:

    101011 * 2 ^ 13
    000101 * 2 ^ 13

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

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

person sui    schedule 07.07.2010
comment
Я действительно имел в виду показатель. Спасибо :) Математика всегда немного сбивает с толку, но мне видится правильно. Не волнуйтесь, вы хороший учитель. :) - person Leandro Jardim; 08.07.2010
comment
Кажется, я помню длинную обличительную речь Кахана о системах до IEEE 754, в которых для выравнивания мантиссы использовалось то же количество цифр, что и в формате, и о плохих свойствах таких систем. Вы, конечно, не получите правильно округленные результаты, если сделаете это. Я не помню, какой именно, но это одна из публикаций на cs.berkeley.edu. /~вкахан - person Pascal Cuoq; 14.04.2011


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

person Ira Baxter    schedule 07.07.2010