Представление с фиксированной точкой двойного типа

Я пытаюсь преобразовать тип double в представление фиксированного типа. В зависимости от выбранного ввода мои необработанные значения могут быть, например, 0,00996, 989,15, 1600,25, 89,72 и так далее. Дело в том, что все мои входные значения всегда положительны, но количество цифр до (и после) десятичного знака может варьироваться. Я пытаюсь преобразовать эти двойные типы в представление с фиксированной точкой с помощью подходящего масштабирования. Я пробовал масштабирование 2.14 (умножить на 16 384), но не уверен, как распространить это на случай переменного количества цифр до десятичного знака. Кроме того, как я могу лучше всего обеспечить максимальную точность/точность в преобразованных значениях? Любая помощь будет принята с благодарностью. Спасибо.

Код, который я использую:

fixedScale = (int) Math.Pow(2.0, 64.0);
int new_val = (int) (fixedScale * value);

person PBrenek    schedule 08.07.2013    source источник
comment
Есть ли причина, по которой вы используете int вместо десятичной дроби? Decimal new_value = (Decimal)original_value   -  person Basic    schedule 09.07.2013
comment
Вы хотите с фиксированной точкой или с плавающей запятой? Я запутался. Если вам нужна фиксированная точка, просто выберите масштаб и умножьте. Я не понимаю, почему вы говорите о переменном количестве цифр. Это не кажется мне очень фиксированной точкой.   -  person David Heffernan    schedule 09.07.2013
comment
представления с фиксированным масштабом   -  person PBrenek    schedule 09.07.2013
comment
Мне нужны представления с фиксированной точкой.   -  person PBrenek    schedule 09.07.2013
comment
Итак, объясните, при чем здесь переменное количество цифр?   -  person David Heffernan    schedule 09.07.2013
comment
Позвольте мне уточнить. Мне нужно выяснить лучший масштаб для масштабирования. Я согласен. Вопрос о количестве цифр здесь бессмысленен. Мне нужна лучшая шкала для максимальной точности.   -  person PBrenek    schedule 09.07.2013
comment
Fixed Point в заголовке меня подкинул. Если вы пытаетесь взять произвольное двойное значение и масштабировать его так, чтобы оно соответствовало диапазону 0 - Int.MaxValue, вам нужно будет знать максимально возможное входное значение. Если вы этого не знаете, любой выбранный вами масштаб в какой-то момент переполнится.   -  person Basic    schedule 09.07.2013
comment
Вы пытаетесь извлечь мантиссу? (например, 0,00996 будет 2870774546471049*2^-58, мантисса будет 2870774546471049).   -  person Theraot    schedule 09.07.2013


Ответы (1)


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

int fixedValue = (int)Math.Round(floatValue*Scale);

А в другую сторону вот так:

double floatValue = (double)fixedValue/Scale;

Что касается того, какую шкалу использовать, это зависит от того, чего вы пытаетесь достичь и каковы входные данные.

person David Heffernan    schedule 08.07.2013
comment
Спасибо. Цифры указаны выше. Мне нужна двойная точность типа. Означает ли это, что мой масштаб должен быть 2 ^ 64? - person PBrenek; 09.07.2013
comment
Я не знаю. Я понятия не имею, каковы ваши ограничения и цели. Я не знаю, что вы имеете в виду, говоря, что мне нужна двойная точность. Вы явно собираетесь пожертвовать точностью, когда пытаетесь преобразовать значение двойной точности во что-то, что соответствует типу int. Также помните, что это не ваши номера. Только 1600.25 можно точно представить в двоичном формате с плавающей запятой. Другие числа не могут быть точно представлены в двойном. - person David Heffernan; 09.07.2013
comment
Я понимаю, что потеряю точность. Думаю, я пытаюсь выяснить точность. Если я использую шкалу 2 ^ 14, то моя точность будет 0,00006, а фиксированная будет соответствовать слову. Это правильно? - person PBrenek; 09.07.2013
comment
Вписаться в слово? Не знаю, что вы имеете в виду. Для заданного масштаба фиксированное значение никогда не будет отличаться более чем на 0,5/масштаб от исходного плавающего значения. - person David Heffernan; 09.07.2013
comment
Если вы заинтересованы в масштабе, а затем в определенной степени точности, почему бы не использовать эту стратегию для десятичных дробей вместо двойных? - person BuZz; 27.03.2014