C++ 使用pow()的除法溢出
当我们计算Q时,由于2^s的大值,会出现溢出。我使用pow(2,s)来计算2^s。假设Q的范围与语句中的一样,如何计算Q 根据您的陈述,我假设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
是十进制的,这涉及浮点运算而不是整数运算
如果由于某种原因不能使用对数,则较慢的方法是计算一个浮点值,其值等于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.