OberonCore https://forum.oberoncore.ru/ |
|
Сравнение вещественных чисел https://forum.oberoncore.ru/viewtopic.php?f=29&t=3327 |
Страница 3 из 4 |
Автор: | igor [ Среда, 16 Март, 2011 19:08 ] |
Заголовок сообщения: | Re: Сравнение вещественных чисел |
Сергей Прохоренко писал(а): Вычисления нужно выполнять с точностью, которая обусловлена точностью исходных данных плюс некоторое количество нулевых разрядов Илья Ермаков писал(а): Сергей, именно это я хотел сказать, спасибо за поправку. То есть вы хотите сказать, что в идеале программист должен вручную задавать точность явно, и каждый раз индивидуально, всякий раз, когда переменной вещественного типа присваивается значение, относящееся к новым данным? |
Автор: | Info21 [ Среда, 16 Март, 2011 20:56 ] |
Заголовок сообщения: | Re: Сравнение вещественных чисел |
При отсутствии надежного контроля за ошибками округления и т.п. действует правило: использовать максимальную точность, какая только есть в наличии. Но это не значит, что выдавать в публикацию нужно 16 бессмысленных цифр, если только одна соответствует точности исходных данных. Если под "вычислением" не путать промежуточные вычисления и выдачу окончательного результата для представления в условную публикацию, то противоречия нет. |
Автор: | ==== [ Среда, 16 Март, 2011 21:10 ] |
Заголовок сообщения: | Re: Сравнение вещественных чисел |
Набор операций сравнения действительных чисел <, =, > заменить на один из наборов <, >= или <=, > . |
Автор: | Alexey Veselovsky [ Среда, 16 Март, 2011 23:21 ] |
Заголовок сообщения: | Re: Сравнение вещественных чисел |
Геннадий Тышов писал(а): Набор операций сравнения действительных чисел <, =, > заменить на один из наборов <, >= или <=, > . http://oberspace.dyndns.org/index.php?t ... 968#msg968 |
Автор: | igor [ Четверг, 17 Март, 2011 06:54 ] |
Заголовок сообщения: | Re: Сравнение вещественных чисел |
Info21 писал(а): При отсутствии надежного контроля за ошибками округления и т.п. действует правило: использовать максимальную точность, какая только есть в наличии. Так, а я за шо? Info21 писал(а): Но это не значит, что выдавать в публикацию нужно 16 бессмысленных цифр, если только одна соответствует точности исходных данных. Согласен. Но речь в обсуждении шла именно о вычислениях, а не о публикации. Я не ожидал такой подмены предмета обсуждения со стороны своих оппонентов (не будем показывать пальцем )
Если под "вычислением" не путать промежуточные вычисления и выдачу окончательного результата для представления в условную публикацию, то противоречия нет. |
Автор: | igor [ Четверг, 17 Март, 2011 06:57 ] |
Заголовок сообщения: | Re: Сравнение вещественных чисел |
Геннадий Тышов писал(а): Набор операций сравнения действительных чисел <, =, > заменить на один из наборов <, >= или <=, > . Эта мера ничего не даст, потому что операции сравнения попарно-инвариантны по отношению друг к другу.
|
Автор: | igor [ Четверг, 17 Март, 2011 19:24 ] |
Заголовок сообщения: | Re: Сравнение вещественных чисел |
Info21 писал(а): Сергей Прохоренко писал(а): Проблема решается просто: в языке должно быть запрещено сравнение вещественных чисел на равенство. А неплохое решение.Позволю себе привести такую аналогию (не со зла, конечно, а для того чтобы попытаться объяснить почему я считаю такое решение нелепым): Цитата: Он неожиданно схватил велосипед за переднее колесо и сильно встряхнул его. -- Переднее колесо болтается, -- объявил он. -- Нисколько не болтается, если его не болтать. (Джером К. Джером "Трое на велосипеде") То есть, если запретить "болтать колесо", то можно считать, что оно "нисколько не болтается" . Ну, а то, что велосипед еще должен ездить по неровным дорогам, - об этом скромно промолчим. |
Автор: | Сергей Прохоренко [ Четверг, 17 Март, 2011 21:14 ] |
Заголовок сообщения: | Re: Сравнение вещественных чисел |
На ноль тоже напрасно запретили делить, да? |
Автор: | Info21 [ Пятница, 18 Март, 2011 03:25 ] |
Заголовок сообщения: | Re: Сравнение вещественных чисел |
IEEE разрешил. Причем на +0 и -0 -- результат может быть +inf и -inf. В ББ. |
Автор: | Валерий Лаптев [ Пятница, 18 Март, 2011 08:14 ] |
Заголовок сообщения: | Re: Сравнение вещественных чисел |
Info21 писал(а): IEEE разрешил. Причем на +0 и -0 -- результат может быть +inf и -inf. В ББ. Везде. Аппаратура так работает. Конкретно в Интеле полностью реализован этот стандарт. Кстати, добавлю. В Интеле реальные вычисления производятся с 64-битной мантиссой. Тип double (real в ББ) имеет мантиссу 53 бита (вместе со скрытой 1). Запаса битов в большинстве случаев хватает, чтобы не заботиться об ошибках отсечения-округления. Кроме того, округлением-отсечением можно управлять программно. Кроме того, практически все элементарные функции реализованы аппаратно, и основные константы - тоже встроены. Для Сергея: реализованы двоично-десятичные числа из 18 разрядов. Но они преобразуются в действительные (с 64 битной мантиссой) для выполнения операций. А потом действительные - обратно можно преобразовать при записи в память. Кроме того, 64-битные целые - тоже аналогичным образом обрабатываются. |
Автор: | Info21 [ Пятница, 18 Март, 2011 08:34 ] |
Заголовок сообщения: | Re: Сравнение вещественных чисел |
Валерий Лаптев писал(а): Info21 писал(а): IEEE разрешил. Причем на +0 и -0 -- результат может быть +inf и -inf. В ББ. Везде. Аппаратура так работает. Конкретно в Интеле полностью реализован этот стандарт.Кстати, добавлю. В Интеле реальные вычисления производятся с 64-битной мантиссой. Тип double (real в ББ) имеет мантиссу 53 бита (вместе со скрытой 1). ... Промежуточные вычисления делаются с 80 битами и в ББ. Ограничение в 64 бита возникает только при сохранении в переменные. |
Автор: | igor [ Пятница, 18 Март, 2011 09:13 ] |
Заголовок сообщения: | Re: Сравнение вещественных чисел |
Сергей Прохоренко писал(а): На ноль тоже напрасно запретили делить, да? В чистой (непрерывной) математике функция y = 1/x имеет разрыв в точке 0. То есть в этой точке она неопределена. Но в нашем случае мы частенько не можем точно определить имеем мы дело с абсолютным нулём или с "почти нулём". Так что IEEE не зря ввели свои +inf и -inf. Это тема для отдельного разговора. |
Автор: | igor [ Пятница, 18 Март, 2011 09:19 ] |
Заголовок сообщения: | Re: Сравнение вещественных чисел |
Валерий Лаптев писал(а): В Интеле реальные вычисления производятся с 64-битной мантиссой. Тип double (real в ББ) имеет мантиссу 53 бита (вместе со скрытой 1). То есть на уровне микрокоманд используется расширенное представление мантиссы при помощи неких скрытых битов? Интересные сведения, надо будет глянуть на досуге.
|
Автор: | igor [ Пятница, 18 Март, 2011 09:38 ] |
Заголовок сообщения: | Re: Сравнение вещественных чисел |
Info21 писал(а): 80 бит -- это FPU регистры. Как я понял, речь была не об Extended Floating Point Format, а о 64-битном Double Precision. Валерий Лаптев меня поправит, если что.
|
Автор: | Сергей Прохоренко [ Пятница, 18 Март, 2011 10:11 ] |
Заголовок сообщения: | Re: Сравнение вещественных чисел |
Info21 писал(а): IEEE разрешил. Причем на +0 и -0 -- результат может быть +inf и -inf. В ББ. Так можно далеко зайти. Чему, например, равно значение этого выражения, где все операнды - вещественные: Код: ((-1/0)+(1/0))/0 Мне кажется, что единице. Лет 25 назад я где-то встречал публикацию по специальной алгебре для оперирования бесконечно большими и бесконечно малыми величинами. Получается, что вещественный 0 никогда не равен целочисленному 0, и для оперирования вещественными +0, -0, +inf и -inf нужна специальная алгебра, поддерживаемая компилятором или железом? А вот делить на целочисленный 0 никогда нельзя!!! А что об этом думает IEEE? Ну, и в любом случае, это не повод разрешать сравнение вещественных чисел на равенство. Если ситуация с делением на ноль может неожиданно возникнуть в реалтайме, то такое сравнение гарантированно можно отловить еще при компиляции, и показать дулю безграмотному программисту. |
Автор: | igor [ Пятница, 18 Март, 2011 11:44 ] |
Заголовок сообщения: | Re: Сравнение вещественных чисел |
Сергей Прохоренко писал(а): А вот делить на целочисленный 0 никогда нельзя!!! С этим я согласен. Целочисленный ноль - всегда гарантированно абсолютный ноль. А гипербола 1/x, как я уже сказал, терпит в этой точке разрыв.
|
Автор: | S.V.D. [ Пятница, 18 Март, 2011 14:52 ] |
Заголовок сообщения: | Re: Сравнение вещественных чисел |
Интересная тема поднялась В своё время я тоже сталкивался с подобными неприятностями, испробовал на своей шкуре. Не так давно натолкнулся на интересный с моей точки зрения сайт Владимира Юровицкого. У него есть раздел как раз на счёт точности вычислений в ПК и их решения. 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 например неверно отображали некоторые математические символы. |
Автор: | igor [ Пятница, 18 Март, 2011 14:58 ] |
Заголовок сообщения: | Re: Сравнение вещественных чисел |
2S.V.D. Спасибо! Вроде интересные ссылки. Надо будет посмотреть. |
Автор: | Валерий Лаптев [ Пятница, 18 Март, 2011 23:27 ] |
Заголовок сообщения: | Re: Сравнение вещественных чисел |
Info21 писал(а): Валерий Лаптев писал(а): Info21 писал(а): IEEE разрешил. Причем на +0 и -0 -- результат может быть +inf и -inf. В ББ. Везде. Аппаратура так работает. Конкретно в Интеле полностью реализован этот стандарт.Кстати, добавлю. В Интеле реальные вычисления производятся с 64-битной мантиссой. Тип double (real в ББ) имеет мантиссу 53 бита (вместе со скрытой 1). ... Промежуточные вычисления делаются с 80 битами и в ББ. Ограничение в 64 бита возникает только при сохранении в переменные. Уточняю. 80 бит - это ВСЕ число: со знаком, порядком и мантиссой. А мантисса из этих 80 бит занимает 64 бита. Вычисления выполняются ТОЛЬКО на регистрах (те самые 80 бит размером). При сохранении в память мантисса урезается (и порядок тоже). Для real = double размеры в битах такие: знак+порядок+мантисса = 1+11+53 (53=52+1 скрытый). Для коротких: 1+8+24(23+1 скрытый) |
Автор: | Валерий Лаптев [ Пятница, 18 Март, 2011 23:30 ] |
Заголовок сообщения: | Re: Сравнение вещественных чисел |
igor писал(а): Info21 писал(а): 80 бит -- это FPU регистры. Как я понял, речь была не об Extended Floating Point Format, а о 64-битном Double Precision. Валерий Лаптев меня поправит, если что.В памяти короткие - 32 бита, длинные 64 бита. При загрузке регистра - расширение до 80 бит. Вычисления - только в регистрах, поэтому там лишние 11 бит мантиссы для промежуточных вычислений очень к месту. |
Страница 3 из 4 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |