изменение типа с плавающей точкой на short, но с тем же поведением, что и у переменной типа с плавающей точкой - PullRequest
0 голосов
/ 23 июля 2010

Можно ли поменять

float *pointer

тип, который используется в проекте VS c ++ к какому-либо другому типу, чтобы он все еще вел себя как плавающий тип, но с меньшим диапазоном? Я знаю, что значения с плавающей запятой никогда не превышают некоторое фиксированное значение в этом проекте, поэтому я хочу оптимизировать программу по памяти, которую она использует. Для каждого элемента 'указателя с плавающей точкой * не нужно 4 байта, я думаю, будет достаточно 2 байта. Если я изменю число с плавающей точкой на короткое и имитирую поведение с плавающей запятой, то оно будет использовать в два раза меньше памяти. Как это сделать?

EDIT:

Рассчитывает вероятности. Так что есть такие разделы, как A / B Где A

Ответы [ 4 ]

2 голосов
/ 23 июля 2010

Существует стандартный 16-битный формат с плавающей запятой, описанный в IEEE 754-2008, который называется «binary16». Он указывается в качестве формата для хранения значений с плавающей запятой с пониженной точностью. Для этого почти нет поддержки компилятора (я думаю, что GCC поддерживает его для определенных платформ ARM), но довольно легко накатить свои собственные подпрограммы. Этот парень:

http://blog.fpmurphy.com/2008/12/half-precision-floating-point-format_14.html

написал немного об этом, а также представляет подпрограмму для преобразования half-float <-> float.

Кроме того, здесь, похоже, наполовину плавающая оболочка C ++ class:

half.h: http://www.koders.com/cpp/fidABD00D95DE84C73BF0218AC621E400E07AA77B53.aspx half.cpp http://www.koders.com/cpp/fidF0DD0510FAAED03817A956D251787609BEB5989E.aspx

, который предоставляет "HalfFloat" в качестве возможного типа замены.

2 голосов
/ 23 июля 2010

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

http://www.eetimes.com/discussion/other/4024639/Fixed-point-math-in-C

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

1 голос
/ 23 июля 2010

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

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

0 голосов
/ 23 июля 2010

Код, который вы разместили, и текст вопроса не имеют отношения к фактическому float, но имеют указатели на float. Во всех известных мне архитектурах размер указателя одинаков, независимо от указанного типа, поэтому при его изменении на указатель short или char улучшения не будет.

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

Без большего знания того, что вы делаете, диапазоны для short во многих архитектурах равны [-32k, 32k), где k обозначает 1024. Если ваши диапазоны данных [-32,32) и вы можете использовать примерно 3 десятичных знака, вы можете использовать арифметику с фиксированной точкой с short s, но таких ситуаций немного.

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