Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
37 / 37 / 6
Регистрация: 17.04.2011
Сообщений: 449

Откуда берутся дополнительные разряды?

24.03.2012, 16:01. Показов 1049. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, написал простую программу, которая вручную вычисляет квадратный корень путём перебора значений с дискретом 0.01. Вот её код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
a,b,c:real;
begin
a:=strtofloat(edit1.text);
b:=0;
repeat
c:=b;
b:=b+0.01;
until abs(b*b-a)>=abs(c*c-a);
label1.Caption:=floattostr(c);
end;
Однако у выводимого значения почему-то больше знаков после запятой, чем 2 (см. скриншот). Вопрос - откуда они могли взяться, если дискрет приращения 0.01?
Миниатюры
Откуда берутся дополнительные разряды?  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.03.2012, 16:01
Ответы с готовыми решениями:

Откуда берутся повторения
Почему, когда я запускаю программу в 1 поток, то повторений нету, а когда в 5 то время от времени аккаунты повторяются(Если соединение не...

Откуда берутся POST параметры?
Добрый вечер! Сейчас пытаюсь сделать авторизацию на сайтах, и столкнулся с проблемой, нужна помощь. Пользуюсь сниффером, и смотрю, что...

Откуда при чтении из COM-порта берутся 99 байт?
Здравствуйте! Этот отрывок кода взят из рабоче программы, которая работает около 2-х лет и судя по отзывам - успешно. Она написана на...

3
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
24.03.2012, 19:10
а при умножении дробных чисел что происходит? количество знаков после запятой увеличивается или нет, как думаешь? а если хорошо подумать?!
0
37 / 37 / 6
Регистрация: 17.04.2011
Сообщений: 449
24.03.2012, 23:04  [ТС]
Цитата Сообщение от DenNik Посмотреть сообщение
а при умножении дробных чисел что происходит? количество знаков после запятой увеличивается или нет, как думаешь? а если хорошо подумать?!
Причём здесь умножение дробных чисел? Умножение дробных чисел происходит при проверке условия, а на экран выводится переменная, которая изначально была нулевая и к которой прибавили 0.01 определённое количество раз.
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
25.03.2012, 02:46
Akmas, это происходит из-за потери точности при усечении чисел во время преобразования типа: Extended -> Real (Double). Если вместо Real использовать тип Extended то будет всё так, как задумывалось - аргумент будет распечатываться на форме с двумя знаками после запятой.
---
Поясню, почему так происходит. Числа в компьютере представлены в двоичном виде. А десятичное число 0.01 в двоичной системе представляется как бесконечная дробь. Поэтому, когда выполняется команда:
Delphi
1
2
3
4
5
6
var
  b : Real;
...
begin
...
b := b + 0.01;
то происходит следующее: вычисляется значение выражения b + 0.01. Перед этим вычислением, оба аргумента приводятся к типу Extended. Во время такого приведения недостающие младшие разряды значения из переменной b обнуляются. Затем, вычисляется значение выражения и результат присваивается переменной b. Во время этого присвоения часть младших разрядов в дробной части числа теряется из-за меньшей точности типа Double. И такая потеря младших разрядов происходит на каждой итерации. В результате, погрешность растёт - последствия этого мы и наблюдаем на скриншоте в заглавном посте темы.
---
Вывод - везде, где производятся вычисления с вещественными числами, следует применять тип Extended.
---
Продемонстрирую ещё один код, в котором происходит потеря младших разрядов в дробной части числа:
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.Button1Click(Sender: TObject);
var
  A : Double;
begin
  A := 0.1;
  if A = 0.1 then
    ShowMessage('A = 0.1')
  else
    ShowMessage('A <> 0.1')
  ;
end;
Если выполнить этот код, то получим сообщение с текстом: 'A <> 0.1'. Это происходит по тем же причинам, которые описаны выше. Число 0.1 в двоичном виде представлено в виде бесконечной дроби. Перед сравнением A = 0.1 оба операнда приводятся к типу Extended. При этом, в значении, взятом из переменной A недостающие младшие разряды будут дополнены нулями. А при приведении константы 0.1 к типу Extended младшие разряды обнулены не будут. Поэтому значение, взятое из переменной A будет отличаться от значения 0.1, заданного в виде константы.
Если в этом коде применить тип Extended, то результат его выполнения будет другим:
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.Button1Click(Sender: TObject);
var
  A : Extended;
begin
  A := 0.1;
  if A = 0.1 then
    ShowMessage('A = 0.1')
  else
    ShowMessage('A <> 0.1')
  ;
end;
В результате выполнения этого кода получим ответ: 'A = 0.1'.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.03.2012, 02:46
Помогаю со студенческими работами здесь

Программа для тестирования: откуда берутся ответы?
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,...

Добавляются дополнительные разряды в вещественное число после запятой при получении данных из базы (тип float)
Доброго времени суток. При записи вещественных чисел из базы данных MS SQL в переменные добавляются дополнительные разряды. ...

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

Откуда берутся фотоны?
Берем проводник электрического тока и пропускаем через него ток. Проводник нагревается и начинает светиться. Что изменилось? Атомы те...

Откуда берутся 3 часа
$lost_time = date(&quot;H:i:s&quot;, $result - $res); Нужно перевести в такой формат оставшееся время. в $result = (int)25; //cекунд ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru