SIGFPE Arccos на sqrt, в процедуре из 2-х строк, что делать?

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Re: SIGFPE Arccos на sqrt, в процедуре из 2-х строк, что дел

Сообщение max » 25.10.2019 12:17:07

Vadim писал(а):Таким образом начать нужно с того, что перед её применением проверяем аргумент на вхождение в диапазон допустимых значений:

Не. Значения там передаются и передавались верные. Но если значение после запятой длинное типа 0.99999999999999999999999999999999999999999999999999. То в функции arccos где-то перед sqrt -- число как-то волшебно становилось отрицательным. И это приводило к SIGFPE на sqrt. Если же модифицировать arccos и добавить там abs перед sqrt, то SIGFPE -- уже не возникало. И + у меня там Extended, а не Double. Может быть есть какое-то решение запрещающее/адаптирующее -- числа с переполнением после запятой, для всей программы ?!
max
 

Re: SIGFPE Arccos на sqrt, в процедуре из 2-х строк, что дел

Сообщение Vadim » 25.10.2019 12:21:09

{$OVERFLOWCHECK ON} - Проверка переполнения
{$RANGECHECK ON} - Проверка диапазона
?

max писал(а):Значения там передаются и передавались верные. Но если значение после запятой длинное типа 0.99999999999999999999999999999999999999999999999999.

То они будут неверные... ;-) :D
По умолчанию в конфигурационном файле FPC, для ускорения работы программы, ключики проверки переполнения, диапазона и ввода\вывода отключены...
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: SIGFPE Arccos на sqrt, в процедуре из 2-х строк, что дел

Сообщение max » 25.10.2019 12:38:01

Vadim писал(а):$OVERFLOWCHECK

This means that the compiler inserts code to check for overflow when doing computations with integers. <= а нужно float. ( https://www.freepascal.org/docs-html/prog/progsu64.html )

Вставил в начало юнита, ответ был незамедлительным:

Warning: Illegal compiler directive "$OVERFLOWCHECK"
Warning: Illegal compiler directive "$RANGECHECK"


заменил на:

{$Q+} //- Проверка переполнения
{$R+} //- Проверка диапазона


Но я теперь не знаю, помогает это или нет, т.к. программа перестала выдавать SIGFPE, по неизвестной мне причине. После того как я попытался ввести arccos из листинга принудительно. И порча памяти и т.п. -- отсутствует. В любом случае спасибо. Полезные директивы, пусть проверяют.
max
 

Re: SIGFPE Arccos на sqrt, в процедуре из 2-х строк, что дел

Сообщение Vadim » 25.10.2019 12:44:27

max
С названиями я мог и ошибиться, возможно они в новой версии слегка переименованы. Тем не менее строгая проверка диапазона исходных данных на допустимые значения - вещь крайне необходимая. Видите ведь что бывает при, казалось бы, очевидном. Глаз не видит, а у программы обморок... ;-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: SIGFPE Arccos на sqrt, в процедуре из 2-х строк, что дел

Сообщение max » 25.10.2019 12:49:38

Vadim писал(а):С названиями я мог и ошибиться

наоборот хорошо, т.к. -- это помогло мне быстро найти описание этих директив.
https://www.freepascal.org/docs-html/prog/progsu65.html
https://www.freepascal.org/docs-html/prog/progsu64.html

Буду надеяться, что теперь там всё проверяется. Спасибо.
max
 

Re: SIGFPE Arccos на sqrt, в процедуре из 2-х строк, что дел

Сообщение Vadim » 25.10.2019 12:51:09

max
И всё-таки попробуйте вставить тот код проверки, что я Вам написал. После ввода, вне зависимости от того, что Вы ввели, в переменной уже будет то число, с которым будет работать функция. И именно значение переменной надо проверить на допустимость.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: SIGFPE Arccos на sqrt, в процедуре из 2-х строк, что дел

Сообщение max » 25.10.2019 13:00:20

Vadim писал(а):код проверки

Уже проверял -- программа всегда вычисляет одни и те-же углы, соответственно ошибка 100% была не в этом, т.к. сообщение "Лапуль я в шоке, от таких экзерсисов с числами больше 1 или меньше -1" -- не возникало и не возникает.
max
 

Re: SIGFPE Arccos на sqrt, в процедуре из 2-х строк, что дел

Сообщение Alex2013 » 25.10.2019 13:32:07

Вообще все это похоже на банальный глюк памяти . Суть проблемы в том что практически любое современное ОЗУ (по сути это "зомби" существующий за счет перманентной "реанимации"(регенерации) ) по умолчанию не идеально (да еще есть срывы кеша и сбои предсказания ветвлений в CPU, да теоретически это должно сказываться только на быстродействии но видимо "возможны варианты" )...
Так что в случае действительно важных вычислений как вариант стоит запускать контрольные расчеты в гарантированно разных потоках и желательно разными методами ведь обычно подобный "плавающий" сбой ошибки не вызывает, но в расчет вкрадываются разной степени критичности ошибки .
Зы
Кстати что с оптимизацией ? Уровень Q4 иногда впечатляет реально впечатляющими глюками ....
Alex2013
долгожитель
 
Сообщения: 2922
Зарегистрирован: 03.04.2013 11:59:44

Re: SIGFPE Arccos на sqrt, в процедуре из 2-х строк, что дел

Сообщение Снег Север » 25.10.2019 15:01:18

Alex2013, я встречал и не такие глюки... :D Например, стандартное преобразование строки в целое, если в строке значение, больше максимально допустимого целого - компилятор win32 правильно генерирует ошибку, а компилятор win64 выдает херню, но ошибку не генерирует.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: SIGFPE Arccos на sqrt, в процедуре из 2-х строк, что дел

Сообщение max » 25.10.2019 15:37:33

Alex2013 писал(а):что с оптимизацией ?

на дебаге -- дружественно к отладчику.
на релизе -- 3
И там и там падало с SIGFPE. вчера вечером и сегодня утром. А потом, чёртов баг сбежал (((((((.
Снег Север писал(а):глюки

у меня появилось предположение, что парсер, при определённой последовательности функций / литералов / переменных -- мог отправлять не в те регистры. И это как-то приводило к изменению знака, в arccos. Но теперь -- это уже невозможно проверить, т.к. баг сбежал ((((((
max
 

Re: SIGFPE Arccos на sqrt, в процедуре из 2-х строк, что дел

Сообщение Vadim » 25.10.2019 15:38:30

Снег Север писал(а):...а компилятор win64 выдает херню, но ошибку не генерирует.

К компилятору Win64 пока что стоит относиться с очень большой опаской... :D

Добавлено спустя 8 минут 33 секунды:
Re: SIGFPE Arccos на sqrt, в процедуре из 2-х строк, что делать?
max
Я бы Вам посоветовал пользоваться только типом Double. На сегодняшний день он единственный, кто для плавающей точки даёт наименее глючные результаты. Этот тип даже можно отнести к точным. Понятно, имея в виду, что у плавающей точки точных результатов пока что быть не может. Вот если бы в 16 веке победила точка зрения, что дроби надо решать не с помощью десятичной, а с помощью шестидесятиричной системы, тогда можно было бы говорить о точных вычислениях. :)
Extended, увы, даже при простом присваивании способен самоокруглиться до такой степени, что будешь долго пялиться на получившийся результат размышляя, то ли напиться и кого-нибудь зарезать, то ли застрелиться... :D
Если нужно непременно работать с длинными числами, тогда лучше взять специальный модуль для этого, там хоть округление можно определить самостоятельно, что позволит минимизировать ошибку.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: SIGFPE Arccos на sqrt, в процедуре из 2-х строк, что дел

Сообщение max » 25.10.2019 16:00:05

Vadim писал(а):Extended, увы, даже при простом присваивании способен самоокруглиться до такой степени,

В arccos все вычисления именно Extended, так что, чтобы я ни брал, в arccos оно будет преобразовано к Extended. И наоборот лучше брать Extended, т.к. при подобных вычислениях, есть ещё куча подводных камней. Обсуждение есть где-то тут на форуме и там много примеров, о том как из-за плавающей точки (точнее из-за неправильной архитектуры процессоров) -- возникают легко-воспроизводимые ошибки в вычислениях.
max
 

Пред.

Вернуться в Общее

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

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

Рейтинг@Mail.ru