C++ 使用pow()的除法溢出

C++ 使用pow()的除法溢出,c++,c,floating-point,numbers,double,C++,C,Floating Point,Numbers,Double,当我们计算Q时,由于2^s的大值,会出现溢出。我使用pow(2,s)来计算2^s。假设Q的范围与语句中的一样,如何计算Q 根据您的陈述,我假设Q是十进制的,这涉及浮点运算而不是整数运算 如果由于某种原因不能使用对数,则较慢的方法是计算一个浮点值,其值等于a_i+b_i。如果s为正,只需将该值s除以2(在循环中)。如果s为负数,则用乘法代替除法 对于任意的a_i和b_i,您仍有溢出(当s为负值时)或下溢(当s为正值时)的风险,需要对此进行管理。但是,您声称有一项担保,但事实并非如此……我将分别计算

当我们计算Q时,由于2^s的大值,会出现溢出。我使用pow(2,s)来计算2^s。假设Q的范围与语句中的一样,如何计算Q

根据您的陈述,我假设
Q
是十进制的,这涉及浮点运算而不是整数运算

如果由于某种原因不能使用对数,则较慢的方法是计算一个浮点值,其值等于
a_i+b_i
。如果
s
为正,只需将该值
s
除以
2
(在循环中)。如果
s
为负数,则用乘法代替除法


对于任意的
a_i
b_i
,您仍有溢出(当
s
为负值时)或下溢(当
s
为正值时)的风险,需要对此进行管理。但是,您声称有一项担保,但事实并非如此……

我将分别计算分子和分母的对数。如果以2为基数计算,那么分母的对数就是s。数字的除法可以通过减去它们的日志来完成。请展示你的实际代码,解释,你是如何意识到的,你得到了一个溢出,以及你对a_i,b_i和s的值做了什么。在这个范围内的
Q
值不应该溢出:你能给出一些数字的例子吗?2^(10^10)在任何通用浮点格式中都几乎无法表示<在x86和其他支持80或128位扩展浮点数的平台上,code>long double的十进制指数为2^16384,约为2^(10^5)。除此之外的任何内容都不能用标准浮点格式表示。我的建议是将
s
的某个范围之外的值刷新为
0
(太小)或无穷大(太大)-但是如果您需要从中进一步计算
Q
。s=-10^10=>Q>2^(10^10)(除了a_i和b_i都为零的小情况),那么这个问题对我来说似乎不太合适。。。我大概会说-34那么,将一个数字乘以或除以2到10^10倍是否可以防止结果溢出/下溢?除了占用更多的时间外,我不认为这有助于解决问题。OP声称保证范围为
a_I
b_I
,这足以防止
a_I+b_I
的计算溢出。OP还要求保证
Q
的值不会溢出。这意味着计算中唯一可能涉及溢出的部分是调用
pow(2,s)
以获取
s
的某些值。将该计算分成更小的部分,并重复除以/乘以
2
,这是避免计算较大中间值的一种方法,并且不会因OP规定的约束而溢出。这是数值分析的基本技巧。
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.