2015-09-12 2 views
-2
Q = (a_i + b_i)/(2^s) 
-10^10 ≤ s ≤ 10^10 
1 ≤ a_i, b_i ≤ 10^9 

It is guaranteed that -10^10 ≤ Q ≤  10^10. 

Here s,a_i,b_i are integers and Q is a decimal no. 

При вычислении Q происходит переполнение из-за большого значения 2^s. Я использую pow (2, s) для вычисления 2^s. Как я могу вычислить Q, учитывая диапазон Q, как в инструкции.Переполнение раздела с использованием pow()

+0

Я бы взял журнал числителя и знаменателя отдельно. Если вы делаете эту базу данных 2, то журнал знаменателя - это просто s. Разделение чисел может быть выполнено путем вычитания их журналов. – WDS

+1

Пожалуйста, покажите свой фактический код, объясните, как вы поняли, вы получаете переполнение и для каких значений a_i, b_i и s вы делаете. – MikeMB

+0

Это не переполнение для значений 'Q' в этом диапазоне: не могли бы вы привести пример некоторых чисел? –

ответ

0

Я принимаю по вашему утверждению, что Q является десятичным, что связано с операциями с плавающей запятой, а не с целочисленной арифметикой.

Если вы не можете использовать логарифмы по какой-либо причине, более медленным подходом было бы вычисление значения с плавающей запятой со значением, равным a_i + b_i. Если s положителен, просто разделите это значение s раз на 2 (в цикле). Если s отрицательный, умножьте вместо деления.

Для произвольного a_i и b_i, вы по-прежнему быть_наст риск переполнения (когда s отрицательные) или сгущенный (s положительных) и нужны будешь управлять этим. Однако вы утверждаете, что имеете гарантию, что это не так.

+0

Значит, умножение/деление числа на два до 10^10 раз предотвращает переполнение/недополнение? Помимо того, что я занимаюсь гораздо большим временем, я не вижу, как это помогает решить проблему вообще. –

+0

ОП заявила о гарантийном диапазоне 'a_i' и' b_i', что является достаточным для предотвращения переполнения 'a_i + b_i'. ОП также утверждал, что значение 'Q' не будет переполняться. Это означает, что единственная часть вычисления, потенциально связанная с переполнением, связана с вызовом 'pow (2, s)' для некоторых значений 's'. Нарушение этого вычисления на более мелкие части и многократное деление/умножение на '2' - один из способов избежать вычисления этого большого промежуточного значения и не будет переполняться из-за ограничений, установленных OP. Это базовый трюк численного анализа. – Peter