1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

Знатоки Паскаля, помогите!!!

Тема в разделе "Программирование", создана пользователем Гость, 20.11.07.

  1. Гость

    Гость Гость

    Про TButton и TMemo писАть, думаю, не стОит... Сразу к теме:

    Нужно посчитать функцию y=sin(2*x)/sqr(x) при x[-1;1] и получить результат при x<>0.

    вот здесь считаем:
    --------------------------------------------------
    procedure TForm1.Button1Click(Sender: TObject);
    var
    x, y : real;
    s1, s2: string;
    begin
    x := -1;
    while x <= 1 do
    begin
    if x <> 0 then
    begin
    y := sin(2*x)/sqr(x);
    str(x:7:20,s1);
    str(y:7:2,s2);
    Memo1.Lines.Add('x = '+s1+Chr(9)+'y = '+s2);
    end;
    x := x + 0.2;
    end;
    end;
    -------------------------------------------------
    а вот, что получаем:

    x = -1.00000000000000000000 y = -0.91
    x = -0.80000000000000004000 y = -1.56
    x = -0.60000000000000009000 y = -2.59
    x = -0.40000000000000008000 y = -4.48
    x = -0.20000000000000007000 y = -9.74
    x = -0.00000000000000007000 y = -30025219245102016.00
    x = 0.19999999999999993000 y = 9.74
    x = 0.39999999999999991000 y = 4.48
    x = 0.59999999999999987000 y = 2.59
    x = 0.79999999999999982000 y = 1.56
    x = 0.99999999999999978000 y = 0.91

    Где грабли??? :(
     
  2. Залетный гость

    Залетный гость Активный

    23.427
    958
    Странный у Вас шаг: 0.2:upset:
    А грабли в математическом модуле, его обработке числа типа real.
     
  3. Гость

    Гость Гость


    Так по условию... :(

    А лечить как?
     
  4. Zuka58

    Zuka58 Активный участник

    4.337
    802
    если
    тогда
    делать нельзя.
    и (x = 0) тоже. паскаль тут не при чем.
     
  5. Гость

    Гость Гость

    Как же делать??? Это из школьной программы... :(
     
  6. Zuka58

    Zuka58 Активный участник

    4.337
    802
    сравнивать на "<" абс. значение "х" с близким к нулю числом, которое заведомо больше ошибки вычисления типа real.

    if(Abs(x) < мало_мало) then begin
    ...
    end;


    "мало_мало" взять, например, 0.00001. не помню, сколько там для real значащих разрядов.
     
  7. Гость

    Гость Гость

    Zuka58, а как ребенок это может объяснить школьному учителю?
     
  8. Залетный гость

    Залетный гость Активный

    23.427
    958
    я в юношестве выдвал листинг учителю и предлагал найти ошибку. Алгоритмически программа написана правильно. С точки зрения синтаксиса - тоже. Пусть учитель доказывает, что парень - верблюд. Это ж учёба, в конце концов...
     
  9. Гость

    Гость Гость

    У меня дочь... ;)
    Я знаю, что в самом алгоритме ошибок нет, сам ОЧЕНЬ давно увлекаюсь программированием ;) , но с подобной фигней впервые столкнулся... Ей сказал, что все правильно написала и чтобы не парилась... :) Спрошу сегодня вечером, что педагок сказал. :)
     
  10. Zuka58

    Zuka58 Активный участник

    4.337
    802
    как ребенок учителю -- не знаю ))
    а вызвано это ограниченной точностью вычислений вещественных чисел
     
  11. Devillio

    Devillio Активный участник

    1.198
    2
    Тут хорошее объяснение.

    наступил на эти грабли, когда считывал и писал "деньги" в базе как "AsFloat". Переделал на "AsCurrency" - баг пропал (или два бага друг друга погасили - главное работает :shuffle: )
     
  12. Hermes

    Hermes Активный участник

    11.635
    2
    Мда. Это же азы. Не сравнивать вещественные числа на "равно" или "не равно", только на "больше" или "меньше".
     
  13. WindMan

    WindMan Активный участник

    14.525
    1.124
    Может для вас это и азы, а я институт закончил в 92г. и программирование тады изучалось исключительно по Васику... Что касается моего программировая на Delphi, то... не было у меня подобных задач.
    Кста, я не уверен, что школьный учитель дочери в курсе про эти грабли.

    Спасибо всем, кто откликнулся!!! :)