Как я вычисляю самое близкое питание 2 или 10, число?

Private Sub Populate()
    Dim dt1 As New DataTable
    Dim dt2 As New DataTable

    con.Open()
    Dim Cmd1 As New SqlCommand("select * from Itemmaster where flag='G'", con)
    dt1.Load(Cmd1.ExecuteReader)
    Cmd1.CommandText = "Select * from Itemdetail"
    dt2.Load(Cmd1.ExecuteReader)


    DataGridView1.AutoGenerateColumns = False
    DataGridView1.DataSource = dt1

    Dim colpgCombo As New DataGridViewComboBoxColumn()
    colpgCombo.DataSource = dt1
    colpgCombo.DisplayMember = "Name"
    colpgCombo.ValueMember = "code"
    colpgCombo.DataPropertyName = "Name"
    colpgCombo.HeaderText = "Product Group"
    DataGridView1.Columns.Add(colpgCombo)

    Dim colpru As New DataGridViewTextBoxColumn()
    colpru.DataPropertyName = "Unit"
    colpru.HeaderText = "Unit"
    DataGridView1.Columns.Add(colpru)

    Dim colHsn As New DataGridViewTextBoxColumn()


    colHsn.DataPropertyName = "Hsncode"
    colHsn.HeaderText = "Hsncode"
    DataGridView1.Columns.Add(colHsn)

    Dim colRate As New DataGridViewTextBoxColumn()
    colRate.DataPropertyName = "Rate"
    colRate.HeaderText = "Rate"
    DataGridView1.Columns.Add(colRate)


End Sub
Private Sub ButtonNewItem_Click(sender As Object, e As EventArgs) Handles ButtonNewItem.Click
    Populate()
End Sub
10
задан Bill the Lizard 18 September 2012 в 17:04
поделиться

5 ответов

n^round(log_n(x))

где log_n является логарифмом для базирования n. Вам, вероятно, придется изменить раунд () в зависимости от того, как Вы определяете "самый близкий".

Отметьте это log_n(x) может быть реализован как:

log_n(x) = log(x) / log(n)

где log логарифм к любой удобной основе.

32
ответ дан 3 December 2019 в 13:56
поделиться

Для питания 2 на целых числах, существует умный прием, которые состоят из копирования последнего бита много раз направо. Затем только необходимо увеличить число, и Вы имеете свою власть 2.

int NextPowerOf2(int n)
{
   n |= (n >> 16);
   n |= (n >> 8);
   n |= (n >> 4);
   n |= (n >> 2);
   n |= (n >> 1);
   ++n;
   return n;
}
5
ответ дан 3 December 2019 в 13:56
поделиться

Для питания 2 и> = 1 Вы видите, сколько раз Вы можете разрядное право сдвига. В течение каждого раза, когда это - 1 дополнительная мощность 2, Вы устраняете. После того как Вы переходите 0, у Вас есть свое число.

2
ответ дан 3 December 2019 в 13:56
поделиться

Я думаю, что мог бы приблизиться к проблеме, но использующий журнал базируются 2, и журнал базируются 10.

log10 (123) 2.something. получите слово этого, затем повышают 10 до того питания, и это должно получить Вас близко.

то же самое должно работать с основой журнала 2.

log2 (9) 3.something, получают слово того затем повышение к к тому питанию

Вы могли бы играть с округлением журнала.

0
ответ дан 3 December 2019 в 13:56
поделиться

Вам, вероятно, придется изменить раунд () в зависимости от того, как Вы определяете "самый близкий".

Ответ Hewgill @Greg корректен кроме него, окружает слишком рано для примеров, которые Вы дали. Например, 10^round (log_10 (3.5)) == 10, не 1. Я предполагаю, что это - то, под чем он подразумевает, 'как Вы определяете "самый близкий"'.

Вероятно, самый простой способ использовать формулу Greg и если это слишком высоко (или слишком низко для x <1), используйте следующее более низкое питание два:

closest = n ^ round(log_n(x))

if (closest > x) {
    other = closest / n
} else {
    other = closest * n
}

if (abs(other - x) < abs(closest - x)) {
    return other
} else {
    return closest
}
0
ответ дан 3 December 2019 в 13:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: