|
71 / 59 / 14
Регистрация: 20.12.2013
Сообщений: 723
|
|
Как отловить +/-INF и NAN?02.01.2017, 05:42. Показов 9808. Ответов 5
Метки нет (Все метки)
Здравствуйте.
Проблема в возникновении в ходе вычислений указанных в заголовке значений. Причем трагизм ситуации в том, что после начала работы программы до ошибки проходит около часа. Есть ли возможность как-то сделать так, чтобы программа останавливалась как только в произведенных вычислениях встречаются эти значения (и чтобы останавливалась на строчке с ошибкой)? Вариант создать свой тип double, где бы происходила проверка каждой операции не катит, поскольку этот час растянется на сутки.
0
|
|
| 02.01.2017, 05:42 | |
|
Ответы с готовыми решениями:
5
Расчётная функция #0 вернула значение NaN/Inf Доказать равенство inf{x+y}=inf{x}+inf{y} Считать с файла in.inf число и вывести в out.inf его, умноженное на 2 |
| 02.01.2017, 06:43 | |
|
0
|
|
|
71 / 59 / 14
Регистрация: 20.12.2013
Сообщений: 723
|
|
| 02.01.2017, 06:59 [ТС] | |
|
zer0mail, по ссылке, опять же, функции. Хотелось бы что-то типа _matherr для функций math.h, чтобы не городить ничего нового
0
|
|
| 02.01.2017, 07:20 | |
|
В гугле забанили? Вот, например http://www.avprog.narod.ru/progs/exceptions.htm
1
|
|
|
|
||
| 02.01.2017, 12:00 | ||
|
Под линуксом есть возможность вызывать сигнал по некоторым вещественным ситуациям https://linux.die.net/man/3/feenableexcept Но тут проблема такая, что во-первых нет уверенности, что всё это на 100% поддерживается (т.к. мешает оптимизациям), а во-вторых скорее всего тут не весь спектр возможностей, в результате которых может родиться inf/nan C #include <stdio.h> #include <stdlib.h> #include <string.h> #include <signal.h> #define _GNU_SOURCE #include <fenv.h> void handler (int param) { printf ("handler\n"); exit (0); } double d1 = 1.0, d2 = 0.0, d3; int main() { struct sigaction act; memset (&act, 0, sizeof (act)); act.sa_handler = handler; sigemptyset (&act.sa_mask); sigaction (SIGFPE, &act, NULL); printf ("point1\n"); /* По умолчанию деление на ноль отработает */ d3 = d1 / d2; printf ("point2\n"); /* А здесь прилетит сигнал */ feenableexcept (FE_DIVBYZERO); d3 = d1 / d2; printf ("point3\n"); return 0; } Code $ gcc t.c -lm $ ./a.out point1 point2 handler В постах #4 и #5 представлены методы, которые ловят аппаратные прерывания. Программная обёртка для них разная, но внутренние кишки одинаковые (в разных системах пошли разными путями). Но эти методы не поймают ситуаций, когда inf/nan рожаются программно. Например, при вычислении корня из отрицательного числа в функции sqrt делается проверка аргумента, если он меньше нуля, то просто возвращается nan. Т.е. nan сгенерировался программно, а не аппаратно, как-то я сильно сомневаюсь, что подобную ситуацию можно поймать. Только если в функции sqrt разработчики для получения nan'а воткнули явную операцию, которая вырабатывает nan аппаратно и взводит соответствующие флаги в процессоре
2
|
||
|
71 / 59 / 14
Регистрация: 20.12.2013
Сообщений: 723
|
|||
| 02.01.2017, 15:44 [ТС] | |||
|
Пока не пробовал, но, думаю, функции _controlfp или signal могут помочь. И да, забыл написать, RAD STUDIO - может лучше бы даже в разделе про билдер стоило мне писать. Добавлено через 8 минут p.p.s. И да, Windows
0
|
|||
| 02.01.2017, 15:44 | |
|
Помогаю со студенческими работами здесь
6
Как вернуть NaN и Infinity, проверить на NaN и Infinity? При создании службы INF‑файлом ошибка: выбранный INF файл не поддерживает этого метода установки Как реализована Double.NaN != Double.NaN Раскрытие неопределенности inf/inf
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|