Помощь новичкам

Подскажите, как включить подсказки при вводе названия модуля (чтобы программа в выпадающем окне предлагала закончить его название)? После переустановки паскаля такая функция пропала :frowning:

Её и небыло, анализатор кода никогда не показывал возможно подходящие файлы в папке.

Он может подсказывать имя пространства имён, как System, если использовать Ctrl+Space (или включить подсказку по нажатию, или как её там).
И модули, которые уже подключены, добавляют одноимённое пространство имён в контекст, поэтому можно написать:

## uses GraphWPF;
gr

Поставить в конце курсор и нажав Ctrl+Space увидеть в списке GraphWPF.

1 лайк

Посоветуйте хороший учебник если такой существует. Пожалуйста.

Спасибо.

var 
  b:set of integer;
  e:set of 1..15;     
begin
  b:=[];
  b:=b+[3]+[2.5];
  writeln(b);
  e:=[];
  e:=e+[5]+[2.5]+[17];
  writeln(e);
end.

Прокомментируйте, пожалуйста. Почему дробные числа попадают в множество?

Да, такого не должно конечно быть

А когда исправят?

Надо Issue написать

Я не умею…

Root(-8, 3) это не NaN, это -2. Получается,

function Root(x, n: real): real;
begin
  Result := x ** (1 / n);
  if real.IsNaN(Result) and (Frac(n) = 0) and (Frac(n / 2) <> 0) then
    Result := Sign(x) * Abs(x) ** (1 / n);
end;

правильнее, чем

. Этого всё равно не хватает: Root(-8, 1.5) это не NaN, это 4: Root(-8, 1.5) = (-8)^(2/3) = Root((-8)^2, 3) = Root(64, 3) = 4. Тут всплывает давний вопрос:

Получается,

uses NumLibABC;

// Источник: http://forum.mmcs.sfedu.ru/t/pomoshh-novichkam/263/2724
/// Корень степени n из x без учёта дробных степеней из отрицательных чисел.
function Root(x, n: real): real;
begin
  Result := x ** (1 / n);
  if real.IsNaN(Result) and (Frac(n) = 0) and (Frac(n / 2) <> 0) then
    Result := Sign(x) * Abs(x) ** (1 / n);
end;

/// Корень степени n из x.
function Root(x: real; n: Fraction) := Root(x ** real(n.denominator), real(n.numerator));

begin
  Write(Root(-8, Frc(3, 2))); //4
end.

(с дробью) правильнее всего и по-другому никак?

Правильно, это и работает:

## (-8 ** (1/3)).Print;

И не забывайте, чтоб корень это обратная операция степени.
Нет никакого x, так чтоб x**2=-4, поэтому -4 ** (1/2) и должно давать NaN.

А даёт -2:

image

Тут работает приоритет операций, а не это. А через подпрограмму дробные степени из отрицательных чисел дают NaN. Возможно ли избежать это без использования NumLibABC.Fraction?

image

Да, операция ** - по факту вызов функции и приоритет выше, чем для унарного минуса. Это указано в Справке. Поэтому -4 ** х эквивалентно -(4 ** х) и никогда там NaN не будет. Хотите NaN - пишите (-4) ** x

Друзья. Мы когда обучаем детей четырёх арифметических операций, обучаем их приоритеты, т.е. умножение и деление первым, сложение и вычитание вторым (если нет скобки). Затем в средних классах (6-7), когда обучим им операцию возведения в степень, мы часто забываем о том, что надо подсказать учащимся, что операция возведения в степень имеет большой приоритет и выполняется первым по отношению первых четырёх операций. Вот это надо учитывать и при обучение программированию!

Вот только понятию унарного минуса и его приоритету внимание при этом не уделяется.

Предисловие к первому вопросу

Точнее, от 2^1023 до 2^1024 (∞) погрешность real достигает 2^970, поскольку погрешность — половина расстояния между числами, а расстояние = 2^971. Вообще, расстояние между числами в [2^n;2^(n+1)] = 2^(n-52), где n ∈ Z, n ∈ [-1022;1023]. Понятно, что расстояние между 2^(-1075) (0) и 2^(-1074) (real.Epsilon) = последнему.

(Вопрос.)

Кстати, тогда число = мантисса / 2^1074, где мантисса ∈ Z, мантисса ∈ [2^0;2^52].

  1. Правильно ли, что для n ∈ [-1074;-1023] расстояние между числами = (2^(n+1)-2^n)/(1+2^(n+1074))?

  2. Есть ли стандартные подпрограммы для получения мантиссы и порядка типа real, то есть обратные нижеприведённым?

Вопрос неправильно поставлен - вместо NumLibABC.Fraction всегда можно сделать свой тип.
Другое дело - возведение отрицательного числа в не_целую степень без расписывания степени в виде дроби из 2 целых.

Представление числа в real всегда хранит значение в формате, который можно представить в виде ±a / (2**b) где a и b - целые. a связано с содержимым мантисы, а b - с длиной мантисы и экспонентой.
Тем временем чтоб из отрицательного числа можно было взять корень - знаменатель степени (то есть степень корня) должна быть нечётным.
То есть даже если степень записали как 1/3 - после потери точности из за природы real - знаменатель окажется чётным.

Так что да, в случае real - отрицатльное число в не_целой степени в принципе не имеет смысла считать. Надо смотреть на конкретные случаи, когда нужна такая операция - и думать что делать в этих случаях отдельно.

Есть побитовые операции, которые можно применить к real если прочитать его как целое.
Пример где я уже доставал отдельно мантису и экспоненту из real можете посмотреть тут:

Кстати, NaN не поэтому, а чтобы не было противоречия в математике. Если a < 0, k — нечётное, то a^(k/n) = a^((kp)/(np)), только если p — нечётное. Иначе получится |a|, а a<>|a|.

Обобщить никак? В файле лучшее обобщение, кроме оптимизации? Желательно обобщить, учитывая следующие пункты:

  1. Чтобы все возможные степени вычислялись без исключений, например, “x**(знаменатель n) не помещается в real” (см. Корень дробной степени из отрицательного числа.pas (5.8 КБ)). Может, для этого скопировать код System.Math.Pow и убрать оттуда, что

? Но для этого бы понять, куда ведёт https://github.com/SSCLI/sscli20_20060311/blob/707ae167cb556e76297df525369a5bdb0c6abee7/clr/src/classlibnative/float/comfloat.cpp#L275 .

  1. Без лишних NaN, например,
  1. При произвольной степени невозможно

?

  1. Максимально точно, чтобы не было случаев, когда

Может, для этого использовать подпрограмму корня типа, отличного от real? Есть ли такие вообще?