Мой вопрос прост: я могу сделать 2 * 10
со сменой и добавлением (2 << 2) + 2
, но я понятия не имею, как получить 2.2 * 10
со сменой и добавлением. Любые предложения будут очень оценены.float point mul (* 10) с добавками и сменами
-khan_gl
Мой вопрос прост: я могу сделать 2 * 10
со сменой и добавлением (2 << 2) + 2
, но я понятия не имею, как получить 2.2 * 10
со сменой и добавлением. Любые предложения будут очень оценены.float point mul (* 10) с добавками и сменами
-khan_gl
Это работает:
2.2 + 2.2 + 2.2 + 2.2 + 2.2 + 2.2 + 2.2 + 2.2 + 2.2 + 2.2 + (0 << 1)
Шутки в сторону, вы не можете, как вы не можете сдвинуть поплавки в C++/C. Ну, вы можете (через неприятный тип-каламбур), но затем вы попадаете в неопределенное поведение.
Кроме того, нет смысла делать это. Если вы делаете умножение, просто используйте *
. Компилятор преобразует его в наиболее эффективную форму.
Если я понял ваш вопрос вообще,
2,2 = 2 + 2/10
Таким образом, 10 * 2,2 = 2 * 10 + 2 * 10/10 = 2 * 10 + 2 = 22 .
Вы можете делать деление со сдвигами и вычитаниями.
На современном процессоре номера с плавающей запятой представлены в формате «IEEE 754».
В основе стандарта IEEE 754 арифметики с плавающей точкой являются битовыми сдвиги и целые арифметика. Если вы пациент вы можете написать наивную реализацию IEEE 754 ALU в C. Вы можете найти эту нить интересную:
Если вы используете двойными или плавать, как я думаю, вы можете Просто. Бинарное представление числа с плавающей запятой является стандартным кошмаром. Если вы можете иметь дело с номерами фиксированной точки, тогда это легко. –
Немного связанных: http://stackoverflow.com/questions/7720668/fast-multiplication-division-by-2-for-floats-and-doubles-cc – Mysticial
@BLUEPIXY: '(x << 3) + (x < <2) 'is' x * 12', а не 'x * 012'. –