Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.12.2022, 07:41   #1
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию Delphi 7. Потеря точности.

Встретился интересный момент.
Решаю студентке-двоечнице задачку, вычисляю ряд. https://programmersforum.ru/showthre...06#post1855306 Всё нормально, ряд знакопеременный, сходящийся. Delphi 7. Но что за фигня? С определённого момента член ряда не меняется. Достигнут предел точности double? Но ведь сумма меняется нормально! Глюк преобразования?
Попробовал масштабнуть умножением на 1000000 - разница ожидаемо уже в 6-м знаке.
Попробовал в Excel 1/200001 и -1/200003 - разница есть, но где-то далеко за 10-м знаком.
Есть мысли? Интересно проверить на другой версии Д. или другом языке.

Код:
procedure TForm1.Button2Click(Sender: TObject);
var i, j, znak: integer; s, jf, tmp: double;
begin
   s := 0;
   znak := -1 ;
   for i := 1 to 100000 do
     begin
        j := (i + i + 1) * znak;
        znak := -znak ;
        tmp := 1.0/j;
        s := s + tmp ;
        if (i < 20) or (i > 99990) then
           Memo1.Lines.Add (Format('%8d %8d %12.9f %12.9f',[i,j,tmp,s]) )
       end;
   jf := 1000000.0/200003.0 ; tmp := -1000000.0/200001.0 ;
   Memo1.Lines.Add (Format('%12.9f %12.9f',[jf,tmp]) )
end;
Код:
      18       37  0,027027026 -0,201453243
      19      -39 -0,025641026 -0,227094270
   99991  -199983 -0,000005000 -0,214604571
   99992   199985  0,000005000 -0,214599570
   99993  -199987 -0,000005000 -0,214604570
   99994   199989  0,000005000 -0,214599570
   99995  -199991 -0,000005000 -0,214604570
   99996   199993  0,000005000 -0,214599570
   99997  -199995 -0,000005000 -0,214604570
   99998   199997  0,000005000 -0,214599570
   99999  -199999 -0,000005000 -0,214604570
  100000   200001  0,000005000 -0,214599570


 4,999925001 -4,999975000
--------------------------------------------
PS Частично разобрался: в формате вывода не хватает разрядов, изменение начинается с 11-го разряда. А при масштабировании первые 5 нулей "улетают" .
Но почему тогда в сумме заметны изменения уже с 5-6-го разряда, а последние 3 знака не меняются?
----------------------
PPS Ложная тревога. Вывел в формате 15.12 - всё изменяется, всё выводится как надо.

Excel:
Изображения
Тип файла: jpg 12.JPG (3.3 Кб, 40 просмотров)

Последний раз редактировалось digitalis; 24.12.2022 в 13:45.
digitalis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
достяжение точности. АлександрАврел Visual C++ 1 22.06.2012 09:31
Исследование точности проекционного метода оценивания или как построить в Delphi график сложной функции jorj Помощь студентам 0 21.01.2012 23:33
Вопрос точности вычисления! Alexunder09 Visual C++ 0 15.02.2011 17:58
Delphi проблема в точности.... tanek Помощь студентам 2 25.10.2009 16:06
Не точности по проге Sasuke-sama Общие вопросы C/C++ 3 01.06.2009 19:51