2012-03-08 5 views
2

Мой вопрос прост: я могу сделать 2 * 10 со сменой и добавлением (2 << 2) + 2, но я понятия не имею, как получить 2.2 * 10 со сменой и добавлением. Любые предложения будут очень оценены.float point mul (* 10) с добавками и сменами

-khan_gl

+0

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

+0

Немного связанных: http://stackoverflow.com/questions/7720668/fast-multiplication-division-by-2-for-floats-and-doubles-cc – Mysticial

+0

@BLUEPIXY: '(x << 3) + (x < <2) 'is' x * 12', а не 'x * 012'. –

ответ

2

Это работает:

2.2 + 2.2 + 2.2 + 2.2 + 2.2 + 2.2 + 2.2 + 2.2 + 2.2 + 2.2 + (0 << 1)

Шутки в сторону, вы не можете, как вы не можете сдвинуть поплавки в C++/C. Ну, вы можете (через неприятный тип-каламбур), но затем вы попадаете в неопределенное поведение.

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

+0

Что '0 << 1' для? Я не думаю, что это UB, стандарт требует целочисленных операндов для операторов сдвига. –

+0

OP хочет сдвиг ... так ... – Mysticial

+0

@Alex khan хотел сдвиг там, поэтому я выполнил;) UB происходит от каста плавания до int, чтобы выполнить смену. – Pubby

1

Если я понял ваш вопрос вообще,

2,2 = 2 + 2/10

Таким образом, 10 * 2,2 = 2 * 10 + 2 * 10/10 = 2 * 10 + 2 = 22 .

Вы можете делать деление со сдвигами и вычитаниями.

1

На современном процессоре номера с плавающей запятой представлены в формате «IEEE 754».

В основе стандарта IEEE 754 арифметики с плавающей точкой являются битовыми сдвиги и целые арифметика. Если вы пациент вы можете написать наивную реализацию IEEE 754 ALU в C. Вы можете найти эту нить интересную:

Смежные вопросы