Как вычислить произвольное питание/корень?

Это - мое решение, когда я столкнулся с ним: ProgressDialog не Fragment ребенок, таким образом, мой пользовательский класс "ProgressDialogFragment" может расшириться DialogFragment вместо этого для хранения диалогового окна показанным для изменений конфигурации.

import androidx.annotation.NonNull;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle; 
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentManager;

 /**
 * Usage:
 * To display the dialog:
 *     >>> ProgressDialogFragment.showProgressDialogFragment(
 *              getSupportFragmentManager(), 
 *              "fragment_tag", 
 *              "my dialog title", 
 *              "my dialog message");
 *              
 * To hide the dialog
 *     >>> ProgressDialogFragment.hideProgressDialogFragment();
 */ 


public class ProgressDialogFragment extends DialogFragment {

    private static String sTitle, sMessage;
    private static ProgressDialogFragment sProgressDialogFragment;

    public ProgressDialogFragment() {
    }

    private ProgressDialogFragment(String title, String message) {
        sTitle = title;
        sMessage = message;
    }


    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return ProgressDialog.show(getActivity(), sTitle, sMessage);
    }

    public static void showProgressDialogFragment(FragmentManager fragmentManager, String fragmentTag, String title, String message) {
        if (sProgressDialogFragment == null) {
            sProgressDialogFragment = new ProgressDialogFragment(title, message);
            sProgressDialogFragment.show(fragmentManager, fragmentTag);

        } else { // case of config change (device rotation)
            sProgressDialogFragment = (ProgressDialogFragment) fragmentManager.findFragmentByTag(fragmentTag); // sProgressDialogFragment will try to survive its state on configuration as much as it can, but when calling .dismiss() it returns NPE, so we have to reset it on each config change
            sTitle = title;
            sMessage = message;
        }

    }

    public static void hideProgressDialogFragment() {
        if (sProgressDialogFragment != null) {
            sProgressDialogFragment.dismiss();
        }
    }
}

проблема состояла в том, чтобы сохранить диалоговый заголовок & обменивайтесь сообщениями, в то время как экранное вращение, поскольку они сбрасывают к пустой строке по умолчанию, хотя диалоговое окно, все еще показанное

существует 2 подхода для решения этого:

Первый подход: Делают действие, которое использует диалоговое окно для сохранения состояния во время изменения конфигурации в файле манифеста:

android:configChanges="orientation|screenSize|keyboardHidden"

Этот подход не предпочтен Google.

1119-секундный подход: на действии onCreate() метод, необходимо сохранить Ваш DialogFragment путем восстановления ProgressDialogFragment снова с заголовком & обменивайтесь сообщениями следующим образом, если эти savedInstanceState не является пустым:

@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_deal);

 if (savedInstanceState != null) {
      ProgressDialogFragment saveProgressDialog = (ProgressDialogFragment) getSupportFragmentManager()
              .findFragmentByTag("fragment_tag");
      if (saveProgressDialog != null) {
          showProgressDialogFragment(getSupportFragmentManager(), "fragment_tag", "my dialog title", "my dialog message");
      }
  }
}
6
задан Pete Kirkham 9 September 2009 в 17:04
поделиться

2 ответа

Является ли ваш диапазон входных значений произвольным или известен в пределах определенного диапазона?

в любом случае x m = exp (m log x), поэтому, если вы может создавать функции для вычисления exp (x) и log (x) и иметь умножение, вы, вероятно, все в порядке.

Вам нужно будет выяснить, как вы хотите обрабатывать неположительные значения x.

(подсказка для журнала (x): если это с плавающей точкой IEEE-754 , сместите мантиссу, если необходимо, пока вы не получите диапазон чисел от 2 k до 2 k + 1 для некоторого значения K. Это позволяет вам работать с диапазоном 2: 1, что не слишком трудно аппроксимировать с помощью многочленов. Тогда у вас будет лишь небольшое количество возможностей для обработки экспоненты и числа сдвига.

Соответствующий совет для exp (x): напишите x = k + b, где 0 <= b < 1 и k - целое число. Тогда exp (x) = exp (k) * exp (b); b имеет ограниченный диапазон, а k имеет ограниченное количество дискретных возможностей.)

(подсказка № 2: числа, вероятно, лучше работают для x m = g (mf (x)), где f (x ) = log 2 x и g (x) = 2 x .)

7
ответ дан 9 December 2019 в 20:46
поделиться

Как сказал Джейсон С., это делается с использованием тождества x m = exp (m log x). Однако на практике вам придется иметь дело с ошибками усечения. Я думаю, что обычно это делается так:

  1. Используйте это тождество: x m = (2 n * x / 2 n ) m = 2 нм * (x / 2 n ) m и найдите такое целое число n, что 1 <= x / 2 n <2.
  2. Вычислить t = log2 (x / 2 n ). Это можно сделать либо с помощью достаточно высокого разложения Тейлора, либо с помощью старого доброго Ньютона-Рафсона. Вы должны убедиться, что максимальная ошибка в интервале [1, 2 [не слишком велика для вас.
  3. Вычислить u = nm + tm.
  4. Теперь наша цель - вычислить 2 u . Используйте тот факт, что 2 u = 2 v * 2 uv , и найдите такое целое число v, что 0 <= uv <1.
  5. Вычислите w = 2 УФ , снова используя нашего друга Тейлора или Ньютона-Рафсона. Интересующий интервал: 0 <= uv <1.
  6. Ваш ответ теперь 2 v * w.
5
ответ дан 9 December 2019 в 20:46
поделиться
Другие вопросы по тегам:

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