Квадратный корень сверхбольшого числа с помощью GMP

Вы правы, в GestureDetector нет событий onScroll, но есть onVerticalDrag события, которые в основном совпадают с другим именем.

Но для этого вам на самом деле не нужен GestureDetector. Вы можете прослушивать изменения прокрутки, обрабатывая уведомления ScrollStartNotification и ScrollEndNotification с помощью NotificationListener, поскольку вы уже используете SingleChildScrollView.

Я создал небольшой пример, чтобы показать вам, что будет производить следующее: При прокрутке флаг для отображения кнопки устанавливается на true, а в конце он сбрасывается обратно на false и восстанавливает дерево без кнопки через 5 секунд, если между ними больше нет уведомлений о прокрутке (вот почему вы не устанавливаете _buttonShowing = false после завершения Future, но до этого.

example

bool _buttonShowing = false;

  @override
  Widget build(BuildContext context) {
    List columnWidgets = List.filled(100, Container(height: 100.0, child: Placeholder()));

    if (_buttonShowing) {
      columnWidgets = List.from(columnWidgets)
        ..insert(
            3, Visibility(child: RaisedButton(child: Text('Press me'), onPressed: () {}), visible: _buttonShowing));
    }

    return Scaffold(
      appBar: AppBar(),
      body: NotificationListener(
        onNotification: (scrollNotification) {
          if (scrollNotification is ScrollStartNotification) {
            if (!_buttonShowing) {
              setState(() => _buttonShowing = true);
            }
          } else if (scrollNotification is ScrollEndNotification) {
            if (_buttonShowing) {
              _buttonShowing = false;
              Future.delayed(Duration(seconds: 5)).then((_) => setState(() {}));
            }
          }
        },
        child: SingleChildScrollView(
          child: Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: columnWidgets),
        ),
      ),
    );
  }

6
задан GEOCHET 27 May 2009 в 20:14
поделиться

3 ответа

Here's the code you need for floating point square root, you can see that the initial input and final output are identical.

#include <stdlib.h>
#include <stdio.h>
#include "gmp.h"

int main (int argc, char *argv[]) {
    mpf_t sq_me, sq_out, test;
    mpf_set_default_prec (10000);
    mpf_init(sq_me);
    mpf_init(sq_out);
    mpf_init(test);
    mpf_set_str (sq_me, argv[1], 10);

    mpf_sqrt(sq_out, sq_me);
    mpf_mul(test,sq_out,sq_out);

    gmp_printf ("Input:       %Ff\n\n", sq_me);
    gmp_printf ("Square root: %.200Ff\n\n", sq_out);
    gmp_printf ("Re-squared:  %Ff\n\n", test);

    return 0;
}

Here's the output with your parameter:

Input:       2452466449002782119765176635730880184670267876783327597434144
51715061600830038587216952208399332071549103626827191679864079776723243005
60059203563124656121846581790410013185929961993381701214933503487587055106
7.000000

Square root: 4952238331303110980924222615988628334869566046038127132471492
86806548130939472399634016783775955618921028.19202568258368255653837168412
92356432661548614332014106174638951390596672950394981098992388116308833260
04535647648563996144250924277757344248059826024201642748515325655438898558
17807282091590722890002

Re-squared:  2452466449002782119765176635730880184670267876783327597434144
51715061600830038587216952208399332071549103626827191679864079776723243005
60059203563124656121846581790410013185929961993381701214933503487587055106
7.000000
12
ответ дан 8 December 2019 в 13:48
поделиться

Вы получаете результат в виде целого числа и затем возводите его в квадрат. Вводимое число не должно быть точным квадратом, поэтому десятичные дроби усекаются и точность числа уменьшается. Посмотрите на категорию функций "mpf" для чисел с плавающей запятой, а не на "mpz" для целых чисел.

5
ответ дан 8 December 2019 в 13:48
поделиться

Статья MSDN несколько запутана в том, что бы нормальное лицо заключило бы от простого чтения (если они не читают это с очень Осторожный адвокат глаз).

Что говорит статью MSDN: GetCWD () не соответствует стандарту ISO C ++. Чтобы соответствовать стандарту ISO C ++ для именования функций (который является то, что нарушает getcwd), Microsoft правильно поставил _ на передней панели функции, поэтому та же функция становится _getcwd (). Это соответствующий ISO C ++ способ названия функции, поскольку getcwd () и _getcwd () не являются стандартными функциями ISO C ++, но представляют собой специальную функцию Microsoft (Vendor) или функцию реализации.

Статья не указывает на то, какой стандартный вызов C ++ ISO для получения рабочего каталога будет ... Хотя это, как правило, читают на быстрый взгляд.

-121--1702832-

Я использую Pibgmp-3.dll

в VB.NET I написал эту функцию для высокой точности квадратного корня. Я не тестировал его полностью, но это заставляет меня квадратный корень из 3 до любой точности, которую мне нужно

 Public Shared Function SquareRoot(ByVal Value As BigInt, ByVal Precision As Integer) As String
    Dim Ten As New BigInt(10)
    Dim DecLen As Integer = Value.Sqrt.ToString.Length
    Dim RootDigits As String = (Value * Ten.Power(Precision * 2)).Sqrt

    'Add trailing zeros
    RootDigits = RootDigits.PadRight((DecLen + Precision), "0")
    Return RootDigits.Substring(0, DecLen) & "." & RootDigits.Substring(DecLen)
End Function
0
ответ дан 8 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

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