Доступно ли представление с фиксированной точкой в ​​C или сборке - PullRequest
2 голосов
/ 15 февраля 2020

Насколько я знаю, представление дроби в C основывается на числах с плавающей запятой и двойных числах в представлении floating point.

Предположим, я пытаюсь изобразить 1.5, который является числом с фиксированной точкой (только один ди git справа от точки радиуса). Есть ли способ представить такое число в C или даже в сборке, используя тип данных fixed point?

Есть ли какие-либо fixed point инструкции для x86 (или других архитектур), которые будут работать на такой тип?

Ответы [ 3 ]

4 голосов
/ 15 февраля 2020

Каждый интегральный тип может использоваться как тип с фиксированной точкой. Мой фаворит - использовать int64_t с подразумеваемым смещением 8 di git, например, вы храните 1.5 как 150000000 (1.5e8). Вам придется проанализировать ваш вариант использования, чтобы выбрать базовый тип и количество цифр для смещения (то есть, если вы используете масштабирование по основанию 10, что и делают большинство людей). Но 64 бита, масштабированные до 10 ^ 8, являются довольно разумной отправной точкой с широким спектром применения.

2 голосов
/ 15 февраля 2020

Хотя некоторые компиляторы C предлагают специальные типы с фиксированной запятой в качестве расширения (не входит в стандартный язык C), их действительно очень мало использовать. Фиксированная точка - это просто целые числа, интерпретируется с другой единицей . Например, валюта с фиксированной точкой в ​​типичных центовых деноминациях просто использует целые числа, которые представляют центы вместо долларов (или какой бы ни была единица всей валюты) для вашей единицы. Аналогично, вы можете думать о 8-битном RGB как о единицах 1/256 или 1/255 "полной интенсивности".

Сложение и вычитание значений фиксированной точки с одной и той же единицей - это просто сложение и вычитание целых чисел. Это как арифметика c с единицами в физических науках. Единственное значение наличия языковой дорожки, что они являются «фиксированной точкой», заключается в том, чтобы вы могли только добавлять / вычитать значения с совпадающими единицами.

Для умножения и деления результат не будет иметь одинаковые единицы как операнды, вы должны либо рассматривать результат как другой тип с фиксированной запятой, либо перенормировать. Например, если вы умножите два значения, представляющие 1/16 единиц, результат будет иметь 1/256 единиц. Затем вы можете либо уменьшить значение в 16 раз (округлить любым подходящим способом), чтобы вернуться к значению с 1/16 единиц.

0 голосов
/ 16 февраля 2020

Если проблема заключается в представлении десятичных значений в виде фиксированной точки, вероятно, есть библиотека для этого для C, вы можете попробовать поиск в Интернете. Вы можете создать свою собственную библиотеку с фиксированной точкой BCD в сборке, используя инструкции, связанные с BCD, AAA (корректирует после сложения), AAS (корректирует после вычитания) и AAM (корректирует после умножения). Однако кажется, что эти инструкции недопустимы в режиме X86 X64 (64-битный), поэтому вам нужно использовать 32-битную программу, которая должна быть запущена в 64-битной ОС.

Финансовые учреждения в США и другие страны по закону обязаны выполнять десятичную математику для значений валют, чтобы избежать проблем с десятичной -> двоичной -> десятичной дробью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...