Ошибки PascalABC.NET


#1515

Пока все тут спорили - @Admin сам сделал issue))


#1516

Я вообще впервые слышу о программистах, специализирующихся на чисто финансовых задачах. Кроме финансистов и учёных есть и другие области, в которых, на сколько мне известно, Decimal не находит широкого применения.


#1517

Мда… Иногда тут просто детский сад какой-то начинается. Холивары на пустом месте, каких программистов больше, что такое “правило” и т.п. Это правда все еще форум мехмата или уже филиал 4сhan’а?

@Admin Таблица – это хорошо, но вы не отреагировали на более важный вопрос касательно ошибок компиляции и работы анализатора кода с типом decimal.


#1518

Похоже, вам иногда лишь бы возразить, все равно о чем, по делу или нет. Из Справки:

Это стандартный тип для данного диалекта языка и должен поддерживаться полноценно, без исключений. Никакого “страха и риска” быть не должно.


#1519

А речь ведь шла не о количестве программистов, а о том, насколько активно тип Decimal используется. Если он никому не нужен, то зачем им заниматься?


#1520

Программисты не специализируются на задачах (как, впрочем, и на языках программирования), если они - профессиональные программисты. Они работают в той сфере и на тех языках, где им платят. Поскольку понятие “профессиональный” как раз и означает, что человек получает основные средства к существованию от указываемой профессии. И вопрос был задан не о том, сколько программистов специализируется в той или иной сфере, а сколько их там работает, т.е. пишет и сопровождает соответствующие задачи. Я, к примеру, проработал на научных и инженерных задачах чуть больше 10 лет, лет 15 на экономико-статистических, а последние 20 лет - на банковских (экономико-финансовых) задачах.


#1521

Перестаньте экстраполировать свой ограниченный опыт на весь мир! Если вы до сих пор не понимаете для чего он нужен, то это совсем не означает, что им никто не пользуется и что он никому не нужен.

Далеко не всегда формат чисел с плавающей двоичной точкой (real / double, single – как это обычно реализовано в “железе”) удовлетворяет задаче работы с вещественными числами. Вот вам простой пример для сравнения:

begin
  var a:decimal := 0.1 + 0.2;
  println('Сравнение с Decimal:', a = 0.3 ? 'Математически верно' : 'Математически неверно!');
 // Результат: Математически верно

  var b:real := 0.1 + 0.2;
  println('Сравнение с Real:', b = 0.3 ? 'Математически верно' : 'Математически неверно!');
// Результат: Математически неверно!
end.

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


#1522

@Admin Хотел написать предыдущий пример более корректно, как

var a := decimal(0.1) + decimal(0.2);

но вылетает странная ошибка “Возможны два преобразования типа: к типу System.Decimal и к типу System.Decimal”


#1523

Да, там с преобразованиями к decimal у нас что-то не в порядке


#1524

По моему, эти ссылки всё же надо давать, потому что даже если вы сами увидели - могут быть те что не увидят. Более того, если кто то будет читать это потом - будет сложно связать 2 события, надо будет проверять по времени.


#1525

В целом, большинство операций работает корректно.

begin
  var a: decimal;
  Decimal.TryParse('12345678901234567890.123456789', a);
  Println(a); // все цифры из литерала точны
  // a.Println; //вызовет ошибку " Неизвестное имя 'Println' "
  a.ToString.Println; // работает
  Writeln(real(a)); // вывод 1.23456789012346E+19
  Writeln(single(a)); // вывод 1.234568E+19
  //a += a; // ошибка " Операция '+=' не применима к типу System.Decimal "
  a := a - 0.000000001;
  Println(a); // нормально чувствует 29-й знак в числе
  a := 1e-10 * a;
  Println(a); // абсолютно верный результат
end.

По поводу issure - там где-то “косяк”, потому что a := c работает нормально.


#1526

Здесь всё верно. += не работает - да, мы его не определяли


#1527

Ну, может, и хорошо :slight_smile: А то потом мерзкие статьи на хабре появляются :joy:


#1528

Жалко, что не определяли a.Println;

Наверно, мысль написать книгу была правильной. Я сейчас пока по целочисленным иду, разыскиваю на примерах различные подвохи, которые могут происходить по незнанию или неаккуратности. Вот как до вещественных дойду, посмотрим что с ними :grinning:


#1529

Для всего нельзя. Это надо для каждого типа индивидуально.


#1530

А я и не прошу. Просто отметил, что жалко… Как бы нет единообразия. Вот тут .Print работает, а тут - нет. Кстати, для decimal не определена даже Sqr, не говоря о более серьезных функциях. Видимо, доллары в квадрат не возводят…


#1531

Да, это немного чужеродный тип


#1532

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


#1533

Глеб, вам не кажется, что вы не только до конца не понимаете то, о чем тут так категорично заявляете, а еще и немного “путаетесь в своих показаниях”? Ну то такое…

В большинстве индустриальных языков, предназначенных для решения широкого круга практических задач есть свой тип Decimal или эквивалентный ему по свойствам (иногда встроенный, иногда в виде доп. библиотеки/расширения), напр., в С#, Java, Python, C99, даже в Visual Basic и VBA, а также во всех развитых универсальных СУБД типа MySQL, InterBase, DB/2 и др. Это как бы намекает о востребованности подобного функционала в глобальной индустрии IT.

В данном диалекте Паскаля это стандартный тип, унаследованный от С#, и это очень здорово, т.к. серьезно расширяет круг потенциально решаемых на нем задач.

Мне кажется, такая постановка вопроса абсолютно бессмысленна, по нескольким причинам:

  1. Тип Decimal – это уже стандартная часть данного ЯП, мы не обсуждаем здесь расширение функционала, а только лишь устранение ошибок или недоделок;
  2. Насколько часто кто-то чем-то пользуется зависит в первую очередь от круга решаемых им задач, а не от конкретного языка. Могут быть как те, кто каждый день в течении многих лет этим пользуется в разных языках, так и те, кто вообще никогда с этим не сталкивался или просто не знает/не понимает что это такое и для чего это нужно.
  3. Пытаться делать какие-либо обобщенные “статистические” выводы из ответов на форуме, которым более-менее активно пользуются чел. 10-12, было бы по меньшей мере наивно.

И вообще, ваш “вопрос” в контексте данного обсуждения – ничто иное, как попытка сохранить лицо после целой серии нелепых утверждений, с которых вы начали свою бессмысленную критику типа Decimal. Именно это я и называю “детским садом”: попытка везде вставить свои ценные “пять копеек” вне зависимости от того, насколько глубоко ты знаком с предметом обсуждения, подмена контекста, категоричность суждений, обобщение частностей и т.п. Пора уже повзрослеть и относиться к себе и своему опыту/знаниям критически.

Прошу прощения у остальной публики за оффтоп…


#1534

@admin, в #998 я использовал тайпклассы только потому что файл которым я тестировал уже был с ними, так меньше менять. С интерфейсами тоже не так:

type 
  I1 = interface end;
  
  t1=class(I1) end;
  
procedure p1<T>(o:T);
where T: I1;
begin
  writeln('I1');
end;

procedure p1<T>(o:T);
begin
  writeln('not I1');
end;

begin end.

Тут пишет что p1 повторно объявлена. Это ошибка? Если нет, то как сделать чтоб на уровне компилятора решало какую подпрограмму вызвать?