Нужна помощь

//uses PT4;
Function IsPower5(K:Integer):Boolean;
  
  Begin
    IsPower5:=(frac(logn(5,k))=0);
  end;
var
  k:integer;
  c:byte;
  
begin
  //Task('Proc26');
  for var i:=1 to 10 do
    begin
      read(k);
      if IsPower5(k) then inc(c);
    end;
    writeln(c);
end.

Помогите пожалуйста! Подскажите где я ошибся в написании кода… Если при написании кода для решения задачника “Task(‘Proc26’)” - при вводе параметра 125 т.е. 5^3 в функции IsPower5 присваивается значение False, тоже самое и при вводе 5^6??? т.е. frac(logn(5,125)) не равно 0, при этом frac(3) =0???

Вставлять код надо так:

```
код
```

Знак ` - это ё, но в англ раскладке.

1 лайк

Спасибо! Исправил.

Надо было создать отдельный файл и протестировать в нём чему на самом деле равно то выражение когда дают 125:

begin
  // N99 значит 99 знаков после запятой. Иначе округляет
  Frac(LogN(5,125)).ToString('N99').Print;
end.

Знак = никогда не должен применяться к значениям типа real, потому что их значение хранится с погрешностью. Единственное исключение - если вы делаете какие то особые оптимизации.

Правильнее, да и эффективнее по скорости - будет использовать div и mod. Операции с целыми всегда работают быстрее и без погрешностей.

1.)Не понимаю почему дробная часть от результата “Log 125 по основанию 5” может не равняться нулю, при том что дробная часть"Log 25(625 или 3125) по основанию 5" = 0? Да если принудительно поставить “Frac(5) вместо Frac(LogN(5,125))” то ответ = 0, т.е. получается “Log 125 по основанию 5” не равно 5? 2.)В данном упражнении не могу использовать mod или div, т.к. степень может быть разной и делитель остаётся неизвестным! Огромное спасибо!

Читайте как работает про формат IEEE 754 если прям оч интересно.

В смысле неизвестным? Делить надо на 5. Но, конечно, не 1 раз, а в цикле.

Опять юные падаваны лезут в машинную арифметику вещественных, не почитав теорию? Эх…

1 лайк

я не понимаю, ведь с точки зрения математики тут не может быть погрешности… Log 5 по основанию 5=1 Log 25 по основанию 5=2 Log 125 по основанию 5=3 Log 625 по основанию 5=4 Log 3125 по основанию 5=5 и т.п. Да Log 12_6_ по основанию 5=3.с дробной частью! И соответственно Frac(от параметров являющихся степенью числа 5) = 0, так и получается, но вот при параметре 125-т.е. степень 3 появляется дробная часть, а параметр -625, т.е. степень 4 дробной части нет. 2.

35 тоже делится на 5 без остатка, но 35 не является целым параметром степени числа 5. Мне же нужно понять по условию задачи… сколько из 10 заданных по условию задачи целых параметров являются целыми степенями числа 5… И первым действием я вычисляю степень в которую надо возвести 5, чтоб получить заданный параметр - logn(5,k). Вторым действием выясняю есть ли дробная часть у полученной степени, если нет, то засчитываю параметр как удовлетворяющий условию задачи… И получается, что изменив условие и проверить 2 параметра ...for var i:=1 to 2 do... 125 и 625 получится, что 625 является целой степенью числа 5, а 125 нет…

С точки зрения математики в дроби 1/10 = 0.1 погрешности нет. Но попробуйте перевести 0.1 в двоичную систему счисления… И попробуйте такой код. Сумеете понять причину - считайте, что немножко продвинулись по дороге познания машинной арифметики вещественных )))

begin
  var a := 0.1;
  var s := 0.0;
  loop 10 do
    s += a;
  // получилась ли единица?
  Writeln(s-1.0:20:16);
  Print(s = 1)
end.

Видимо это не для меня. Спасибо большое за попытку донести до меня)

Тогда Вам не стоит заниматься программированием, да и вообще точными науками. Ибо тут рассуждения элементарные.

1 лайк

Таким не место в нашем классе!

Как знать) Может и Вам не стоит, т.к. математика это тоже точная наука, увы… а понять и суть проблемы и тем более объяснить её не смогли на языке математики…

Двоечник отчитал учителя - это круто!

2 лайка

Это для некоторых норма: приходим без знаний, но по умолчанию предполагаем, что что тут нас все сразу сбегутся учить, ибо как же иначе: “Ой, кто к нам пришел!”. Ну а если что не так - можно и куснуть попытаться, ото ж на него, всего из себя такого, посмели взглянуть косо, не обласкали…

 Таких не берут в космонавты!
 Spaceman! Spaceman!
                  (Манго-Манго)

В общем, “не тем ударился об воду…” )))

В любом случае спасибо и за подсказку, сразу не понял! Видимо и погрешность позже осознаю…

1 лайк

Это была лучшая подсказка:

Вы, в итоге, попробовали? Или таки так и ждали что вам всё разжуют?

В программировании каждый день приходится самому себе разжовывать. Как в первый год программирования, так и в 50. Это основная деятельность которой программистов. Когда всё понятно - написание кода тривиально.

Учитесь разбираться пока есть молодость и подсказки и тех кто знает больше, потому что и то и то быстро закончится.

Не жуя не выйдет ничего. Или разжуй, или получишь нуль. Разжевал сам, разжуй товарищу. Поспешишь, погрешность совершишь.

%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA16

Жуйжуй, глотай!