OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 13 Декабрь, 2019 02:32

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 74 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Среда, 16 Март, 2011 19:08 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Сергей Прохоренко писал(а):
Вычисления нужно выполнять с точностью, которая обусловлена точностью исходных данных плюс некоторое количество нулевых разрядов
Илья Ермаков писал(а):
Сергей, именно это я хотел сказать, спасибо за поправку.

То есть вы хотите сказать, что в идеале программист должен вручную задавать точность явно, и каждый раз индивидуально, всякий раз, когда переменной вещественного типа присваивается значение, относящееся к новым данным?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Среда, 16 Март, 2011 20:56 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8215
Откуда: Троицк, Москва
При отсутствии надежного контроля за ошибками округления и т.п. действует правило: использовать максимальную точность, какая только есть в наличии.

Но это не значит, что выдавать в публикацию нужно 16 бессмысленных цифр, если только одна соответствует точности исходных данных.
Если под "вычислением" не путать промежуточные вычисления и выдачу окончательного результата для представления в условную публикацию, то противоречия нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Среда, 16 Март, 2011 21:10 

Зарегистрирован: Воскресенье, 06 Апрель, 2008 14:43
Сообщения: 557
Набор операций сравнения действительных чисел <, =, > заменить на один из наборов <, >= или <=, > .


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Среда, 16 Март, 2011 23:21 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Геннадий Тышов писал(а):
Набор операций сравнения действительных чисел <, =, > заменить на один из наборов <, >= или <=, > .

http://oberspace.dyndns.org/index.php?t ... 968#msg968


Последний раз редактировалось Alexey Veselovsky Суббота, 17 Сентябрь, 2011 16:07, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Четверг, 17 Март, 2011 06:54 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Info21 писал(а):
При отсутствии надежного контроля за ошибками округления и т.п. действует правило: использовать максимальную точность, какая только есть в наличии.
Так, а я за шо? :D

Info21 писал(а):
Но это не значит, что выдавать в публикацию нужно 16 бессмысленных цифр, если только одна соответствует точности исходных данных.
Если под "вычислением" не путать промежуточные вычисления и выдачу окончательного результата для представления в условную публикацию, то противоречия нет.
Согласен. Но речь в обсуждении шла именно о вычислениях, а не о публикации. Я не ожидал такой подмены предмета обсуждения со стороны своих оппонентов (не будем показывать пальцем :) )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Четверг, 17 Март, 2011 06:57 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Геннадий Тышов писал(а):
Набор операций сравнения действительных чисел <, =, > заменить на один из наборов <, >= или <=, > .
Эта мера ничего не даст, потому что операции сравнения попарно-инвариантны по отношению друг к другу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Четверг, 17 Март, 2011 19:24 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Info21 писал(а):
Сергей Прохоренко писал(а):
Проблема решается просто: в языке должно быть запрещено сравнение вещественных чисел на равенство. :D
А неплохое решение.

Позволю себе привести такую аналогию (не со зла, конечно, а для того чтобы попытаться объяснить почему я считаю такое решение нелепым):
Цитата:
Он неожиданно схватил велосипед за переднее колесо и сильно встряхнул его.
-- Переднее колесо болтается, -- объявил он.
-- Нисколько не болтается, если его не болтать.

(Джером К. Джером "Трое на велосипеде")

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Четверг, 17 Март, 2011 21:14 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
На ноль тоже напрасно запретили делить, да? :wink:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Пятница, 18 Март, 2011 03:25 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8215
Откуда: Троицк, Москва
IEEE разрешил. Причем на +0 и -0 -- результат может быть +inf и -inf. В ББ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Пятница, 18 Март, 2011 08:14 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3124
Откуда: Астрахань
Info21 писал(а):
IEEE разрешил. Причем на +0 и -0 -- результат может быть +inf и -inf. В ББ.

Везде. Аппаратура так работает. Конкретно в Интеле полностью реализован этот стандарт.
Кстати, добавлю. В Интеле реальные вычисления производятся с 64-битной мантиссой. Тип double (real в ББ) имеет мантиссу 53 бита (вместе со скрытой 1). Запаса битов в большинстве случаев хватает, чтобы не заботиться об ошибках отсечения-округления. Кроме того, округлением-отсечением можно управлять программно. Кроме того, практически все элементарные функции реализованы аппаратно, и основные константы - тоже встроены.

Для Сергея: реализованы двоично-десятичные числа из 18 разрядов. Но они преобразуются в действительные (с 64 битной мантиссой) для выполнения операций. А потом действительные - обратно можно преобразовать при записи в память.
Кроме того, 64-битные целые - тоже аналогичным образом обрабатываются.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Пятница, 18 Март, 2011 08:34 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8215
Откуда: Троицк, Москва
Валерий Лаптев писал(а):
Info21 писал(а):
IEEE разрешил. Причем на +0 и -0 -- результат может быть +inf и -inf. В ББ.
Везде. Аппаратура так работает. Конкретно в Интеле полностью реализован этот стандарт.

Кстати, добавлю. В Интеле реальные вычисления производятся с 64-битной мантиссой. Тип double (real в ББ) имеет мантиссу 53 бита (вместе со скрытой 1). ...
80 бит -- это FPU регистры.
Промежуточные вычисления делаются с 80 битами и в ББ.
Ограничение в 64 бита возникает только при сохранении в переменные.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Пятница, 18 Март, 2011 09:13 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Сергей Прохоренко писал(а):
На ноль тоже напрасно запретили делить, да? :wink:

В чистой (непрерывной) математике функция y = 1/x имеет разрыв в точке 0. То есть в этой точке она неопределена. Но в нашем случае мы частенько не можем точно определить имеем мы дело с абсолютным нулём или с "почти нулём". Так что IEEE не зря ввели свои +inf и -inf. Это тема для отдельного разговора.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Пятница, 18 Март, 2011 09:19 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Валерий Лаптев писал(а):
В Интеле реальные вычисления производятся с 64-битной мантиссой. Тип double (real в ББ) имеет мантиссу 53 бита (вместе со скрытой 1).
То есть на уровне микрокоманд используется расширенное представление мантиссы при помощи неких скрытых битов? Интересные сведения, надо будет глянуть на досуге.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Пятница, 18 Март, 2011 09:38 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Info21 писал(а):
80 бит -- это FPU регистры.
Как я понял, речь была не об Extended Floating Point Format, а о 64-битном Double Precision. Валерий Лаптев меня поправит, если что.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Пятница, 18 Март, 2011 10:11 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Info21 писал(а):
IEEE разрешил. Причем на +0 и -0 -- результат может быть +inf и -inf. В ББ.


Так можно далеко зайти. Чему, например, равно значение этого выражения, где все операнды - вещественные:

Код:
((-1/0)+(1/0))/0


:?: :shock:

Мне кажется, что единице. Лет 25 назад я где-то встречал публикацию по специальной алгебре для оперирования бесконечно большими и бесконечно малыми величинами.

Получается, что вещественный 0 никогда не равен целочисленному 0, и для оперирования вещественными +0, -0, +inf и -inf нужна специальная алгебра, поддерживаемая компилятором или железом? А вот делить на целочисленный 0 никогда нельзя!!!

А что об этом думает IEEE?

Ну, и в любом случае, это не повод разрешать сравнение вещественных чисел на равенство. Если ситуация с делением на ноль может неожиданно возникнуть в реалтайме, то такое сравнение гарантированно можно отловить еще при компиляции, и показать дулю безграмотному программисту. :twisted:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Пятница, 18 Март, 2011 11:44 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Сергей Прохоренко писал(а):
А вот делить на целочисленный 0 никогда нельзя!!!
С этим я согласен. Целочисленный ноль - всегда гарантированно абсолютный ноль. А гипербола 1/x, как я уже сказал, терпит в этой точке разрыв.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Пятница, 18 Март, 2011 14:52 

Зарегистрирован: Воскресенье, 26 Июль, 2009 21:14
Сообщения: 3
Откуда: Россия, Пермь
Интересная тема поднялась :)

В своё время я тоже сталкивался с подобными неприятностями, испробовал на своей шкуре.

Не так давно натолкнулся на интересный с моей точки зрения сайт Владимира Юровицкого. У него есть раздел как раз на счёт точности вычислений в ПК и их решения.
http://www.yur.ru/science/computer/index.htm

Здесь он нелестно выражается о IEEE754 http://www.yur.ru/science/computer/IEEE754.htm
А тут, в своей монографии, предлагает решене http://www.yur.ru/science/computer/appro/monografia.htm

PS. Монографию рекомендую смотреть в IE, у меня Opera и FF например неверно отображали некоторые математические символы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Пятница, 18 Март, 2011 14:58 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
2S.V.D.
Спасибо! Вроде интересные ссылки. Надо будет посмотреть. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Пятница, 18 Март, 2011 23:27 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3124
Откуда: Астрахань
Info21 писал(а):
Валерий Лаптев писал(а):
Info21 писал(а):
IEEE разрешил. Причем на +0 и -0 -- результат может быть +inf и -inf. В ББ.
Везде. Аппаратура так работает. Конкретно в Интеле полностью реализован этот стандарт.

Кстати, добавлю. В Интеле реальные вычисления производятся с 64-битной мантиссой. Тип double (real в ББ) имеет мантиссу 53 бита (вместе со скрытой 1). ...
80 бит -- это FPU регистры.
Промежуточные вычисления делаются с 80 битами и в ББ.
Ограничение в 64 бита возникает только при сохранении в переменные.

Уточняю. 80 бит - это ВСЕ число: со знаком, порядком и мантиссой. А мантисса из этих 80 бит занимает 64 бита. Вычисления выполняются ТОЛЬКО на регистрах (те самые 80 бит размером).
При сохранении в память мантисса урезается (и порядок тоже).
Для real = double размеры в битах такие:
знак+порядок+мантисса = 1+11+53 (53=52+1 скрытый).
Для коротких: 1+8+24(23+1 скрытый)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение вещественных чисел
СообщениеДобавлено: Пятница, 18 Март, 2011 23:30 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3124
Откуда: Астрахань
igor писал(а):
Info21 писал(а):
80 бит -- это FPU регистры.
Как я понял, речь была не об Extended Floating Point Format, а о 64-битном Double Precision. Валерий Лаптев меня поправит, если что.

В памяти короткие - 32 бита, длинные 64 бита. При загрузке регистра - расширение до 80 бит. Вычисления - только в регистрах, поэтому там лишние 11 бит мантиссы для промежуточных вычислений очень к месту.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 74 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB