Почему Десятичные числа С плавающей точкой не аппаратно ускорены как Двоичные числа С плавающей точкой?

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

16
задан Jonathan Leffler 19 September 2009 в 23:45
поделиться

11 ответов

Последняя версия стандарта IEEE 754: 2008 действительно определяет аппаратные десятичные числа с плавающей запятой, используя представления, показанные в программном обеспечении, на которое ссылается вопрос. Предыдущая версия стандарта ( IEEE 754: 1985 ) не предоставляла десятичные числа с плавающей запятой. Большинство современного оборудования реализует стандарт 1985 года, а не стандарт 2008 года, но компьютеры IBM iSeries, использующие микросхемы Power6 , имеют такую ​​поддержку, как и мэйнфреймы z10 .

Усилия по стандартизации десятичных чисел с плавающей запятой были инициированы Майком Коулишоу из IBM UK, у которого есть веб-сайт , полный полезной информации (включая программное обеспечение, указанное в вопросе). Вполне вероятно, что со временем другие производители оборудования также будут вводить десятичные блоки с плавающей запятой на своих чипах, но я не слышал заявления о том, когда (и может ли) Intel добавить их. Intel оптимизировала для этого программные библиотеки .

Комитет по стандартам C пытается добавить поддержку десятичных чисел с плавающей запятой, и эта работа - TR 24732.

18
ответ дан 30 November 2019 в 16:58
поделиться

Имеется (немного) ускорение десятичной строки, но ...

Это хороший вопрос. Моя первая реакция была «макрооперации всегда не оправдывались» , но, подумав об этом, то, о чем вы говорите, пошло бы намного быстрее, если бы реализовано в функциональном модуле. Думаю, все сводится к тому, достаточно ли проделаны эти операции. Имеется довольно печальная история макросов и специальных инструкций для конкретных приложений, и, в частности, старые попытки использования десятичных финансовых форматов теперь являются просто устаревшим багажом. Например, я сомневаюсь, что они часто используются, но каждый ПК имеет коды операций Intel BCD , которые состоят из

DAA, AAA, AAD, AAM, DAS, AAS

. Когда-то давно инструкции десятичных строк были обычным явлением на высокопроизводительном оборудовании. Это' Непонятно, повлияли ли они на результаты тестов. Программы тратят много времени на тестирование, разветвление, перемещение и вычисление адресов. Обычно не имеет смысла помещать макрооперации в архитектуру набора команд, потому что в целом кажется, что все идет быстрее, если вы даете ЦП наименьшее количество основных действий, чтобы он мог использовать все свои ресурсы для их выполнения как как можно быстрее.

В наши дни даже не все двоичные операции на самом деле находятся в реальном ISA. Во время выполнения ЦП переводит устаревшую ISA в микрооперации . Все это часть быстрой работы благодаря специализации на основных операциях. Пока что оставшиеся транзисторы, похоже, ждут какой-то работы с графикой и 3D, например MMX, SSE, 3DNow!

Я полагаю, что это так »

4
ответ дан 30 November 2019 в 16:58
поделиться

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

2
ответ дан 30 November 2019 в 16:58
поделиться

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

1
ответ дан 30 November 2019 в 16:58
поделиться

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

Между прочим: десятичное и двоичное числа - это системы счисления, а с фиксированной и плавающей запятой - механизмы для аппроксимации рациональных чисел. . Эти два понятия полностью ортогональны: вы можете иметь десятичные числа с плавающей запятой (таким образом реализована система .NET System.Decimal) и двоичные числа с фиксированной запятой (обычные целые числа являются лишь частным случаем этого).

1
ответ дан 30 November 2019 в 16:58
поделиться

Десятичные дроби (и, в более общем смысле, дроби) относительно легко реализовать как пару целых чисел. Библиотеки общего назначения широко распространены и достаточно быстры для большинства приложений.

Любой, кому нужна максимальная скорость, собирается вручную настроить их реализацию (например, изменить делитель в соответствии с конкретным использованием, алгебраически комбинировать / переупорядочивать операции, умно использование тасования SIMD ...). Простое кодирование наиболее распространенных функций в аппаратный ISA наверняка никогда не удовлетворит их - по всей вероятности, это вообще не поможет.

1
ответ дан 30 November 2019 в 16:58
поделиться

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

0
ответ дан 30 November 2019 в 16:58
поделиться

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

0
ответ дан 30 November 2019 в 16:58
поделиться

Вы имеете в виду типичные числовые целые типы "int", "long", "short" (и т. Д.)? Потому что операции с этими типами определенно реализованы аппаратно. Если вы говорите о больших числах произвольной точности (BigNums, Decimals и т. Д.), Это, вероятно, сочетание редкости операций с этими типами данных и сложности создания оборудования для работы с произвольно большими форматами данных.

-1
ответ дан 30 November 2019 в 16:58
поделиться

Аппаратное обеспечение, которое вы хотите использовать, должно быть довольно обычным.

Старые процессоры имели аппаратную арифметику в двоично-десятичном коде (Binaray coded decimal). (Маленькие чипы Intel имели небольшую поддержку, как отмечалось в предыдущих плакатах)

Аппаратный BCD очень хорошо ускорял FORTRAN, который использовал 80-битный BCD для чисел.

Научные вычисления составляли значительный процент от всего мира.

Поскольку все (условно говоря) получили домашние ПК с Windows, рынок стал крошечным в процентах. Так что никто больше этого не делает.

Поскольку вы не против 64-битных чисел double (двоичная с плавающей запятой) для большинства вещей, это в основном работает.

Если вы используете 128-битные двоичные числа с плавающей запятой на современных аппаратных векторных модулях, это неплохо . Все еще менее точен, чем 80-битный BCD, но вы это понимаете.

На более ранней работе коллега из JPL был удивлен, что мы все еще используем FORTRAN. «Мы перешли на C и C ++, - сказал он нам». Я спросил его, как они решили проблему неточности. Они не заметили. (У них также не та точность приземления космического зонда, которую они имели раньше. Но любой может пропустить планету.)

Так что в основном 128-битные двойники в векторной единице более приемлемы и широко доступны.

Мои двадцать центов. . Пожалуйста, не представляйте это как число с плавающей запятой :)

2
ответ дан 30 November 2019 в 16:58
поделиться

Некоторые процессоры IBM имеют специальное аппаратное обеспечение десятичной запятой (десятичная плавающая запятая | DFP-блок).

В качестве вклада ответил 18 сентября в 23:43 Дэниел Прайден

главная причина заключается в том, что DFP-блокам нужно больше транзисторов в микросхеме, чем BFP-блокам. Причиной является BCD-код для вычисления десятичных чисел в двоичной среде. В IEEE754-2008 есть несколько методов для минимизации перегрузки. Похоже, что DPD hxxp://en.wikipedia.org/wiki/Densely_packed_decimal метод более эффективен по сравнению с BID hxxp://en.wikipedia.org/wiki/Binary_Integer_Decimal методом.

Обычно требуется 4 бита, чтобы покрыть десятичный диапазон от 0 до 9. Бит 10-15 недействителен, но все же возможен при использовании BCD. Поэтому DPD сжимает 3*4=12 бит в 10 бит, чтобы покрыть диапазон от 000 до 999 с возможностью 1024 (10^2).

В общем, надо сказать, что BFP быстрее DFP. И BFP занимает меньше места на чипе, чем DFP.

На вопрос, почему IBM внедрила устройство DFP, можно ответить довольно просто: Они строят серверы для финансового рынка. Если данные представляют собой деньги, они должны быть надежными.

При аппаратном ускорении десятичной арифметики некоторые ошибки не так многочисленны, как в двоичном коде. 1/5 = 0.2 => 0.0110011001100110011001100110... в двоичной системе, поэтому повторяющихся дробей можно избежать.

И функция overhelming round() в excel была бы бесполезна :D (-> функция =1*(0,5-0,4-0,1) wtf!)

надеемся, что это немного объяснит ваш вопрос!

5
ответ дан 30 November 2019 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: