我试图计算一个数字(start_value
)加倍的次数,直到它以尽可能最干净的方式达到特定值(end_value
)。请考虑以下示例:
id start_value end_value
1 40 130
2 100 777
3 0.20 2.1
example 1: 40 * 2 = 80
80 * 2 = 160
160 = above value so therefore we had 2 doubles
example 2: 100 * 2 = 200
200 * 2 = 400
400 * 2 = 800
800 = above value so we had 3 doubles
example 3: 0.20 * 2 = 0.4
0.4 * 2 = 0.8
0.8 * 2 = 1.6
1.6 * 2 = 3.2
3.2 = 4 doubles
答案 0 :(得分:1)
你想要对数。具体而言,确切的次数是两个值的比率的log-of-base-2。你想要下一个更高的整数,所以你想要对它进行舍入。
在Postgres中:
ceiling(log(2, end_value / start_value))
答案 1 :(得分:1)
将结束值除以起始值以获得它们之间的因子。例如130/40 = 3.25。将值加倍一次得到因子2,将它加倍两次得到因子4,依此类推。
您可以使用基数2的对数来计算将值加倍以获得特定因子的次数。 log2(3.25)= 1.7004397 ...然后你将它向上舍入得到你需要加倍的整数次。
二进制对数可以计算为log(n)/ log(2):
select
id,
ceil(log(end_value / start_value) / log(2)) as times
from
TheTable
答案 2 :(得分:0)
尝试以下SQL:
select id, start_value, end_value, floor(log(end_value / start_value,2)/2)
from TempTable
希望这有助于:)
答案 3 :(得分:0)
Postgres提供了log()
的两种变体:Per documentation:
log(dp or numeric)
log(b numeric, x numeric)
具有两个参数的变体计算logarithm to base b
。请注意:
numeric
输入正确的表达方式是:
ceil(log(2.0, end_value::numeric / start_value::numeric)) AS times
numeric
。2.0
而不是2
,使其成为numeric
而不是integer