|
0 / 0 / 0
Регистрация: 10.06.2009
Сообщений: 4
|
|
Проверка переполнения double10.06.2009, 18:39. Показов 13616. Ответов 16
Метки нет (Все метки)
Добрый день!
Подскажите пожалуйста, где можно почитать теорию. Нужно решить задачу, написать функции на С++, которые бы проверяли переполнение при сложении и умножении 2х double, а также проверка на переполнение (underflow) при вычитании/делении. Если кто бросит ссылки на теорию - буду очень благодарен. Если кто поможет совет, тоже буду очень благодарен. Важно, чтоб я сам понял : ). Предлагают double приводить к long double и сравнивать результат (long double) с максимальным значением для double. Может, еще есть какие-то варианты решение, без приведения к более большему типу? Ведь нужно будет значение сравнивать с константой... (хотя double на всех машинах поддерживающих IEEE числа с плавающей точкой равен 8 байтам...) Вообщем, подскажите решения, кто как подобные проблемы решает. Использую g++, linux. Хочеться, чтобы решение было на С++, желательно средствами языка, а не библиотек. Ну и конечно же, чтобы оно было кроссплатформенным... (Хотя может оказаться так, что буду реализовывать через <limits> и long double) Заранее спасибо) Добавлено через 1 час 9 минут 45 секунд Ура!
0
|
|
| 10.06.2009, 18:39 | |
|
Ответы с готовыми решениями:
16
Проверка арифметического переполнения для int Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)" |
|
0 / 0 / 0
Регистрация: 10.06.2009
Сообщений: 4
|
|
| 10.06.2009, 18:44 [ТС] | |
|
Ура! Тему можно удалять!!! : )
Я вспомнил про <limits> и numeric_limits<double>m{in,ax}(), еще подсказали с long double, в итоге у меня все получилось. : ))) Прикрепил решение. Похваться и вдруг кому-то пригодиться : ) Зы: если у кого есть замечания по поводу решения - очень рад буду услышать их и то, как можно его улучшить. И конечно же, если кто-то поделиться другими способами решения этой (уже решенной) задачи, буду очень благодарен! Кузя.
0
|
|
|
|
|
| 10.06.2009, 19:42 | |
|
Вообще для честного решения надо всё-таки читать стандарт IEEE-754 и смотреть, что должно быть. Та может быть NaN или сигнал FPFE.
Максимальное значение в double имеет порядок 10^308, в long double - 10^4932 Т.е. при умножении двух числе в районе максимального double'а ты получишь переполнение в long double (и соотвественно хрен знает какой результат). Т.е. твоё решение по сути является неправильным
0
|
|
|
UNIX-way
712 / 495 / 49
Регистрация: 15.01.2009
Сообщений: 1,720
|
||
| 10.06.2009, 19:47 | ||
|
Убедиться в правильности утверждения можно на примере: 10^3*10^3=10^6 <==> 1000*1000=1000000
0
|
||
|
|
||||||||||||
| 10.06.2009, 19:54 | ||||||||||||
|
Посмотри файл /usr/include/fenv.h
Вот для этих делов там процедуры нахерачены. Надо через них работать. Код будет переносим на другие процессоры (по крайней мере на linux'е) Добавлено через 39 секунд Добавлено через 5 минут 12 секунд В любом случае это более честный способ (учитывая то, что не на всех платформах есть long double):
1
|
||||||||||||
|
0 / 0 / 0
Регистрация: 10.06.2009
Сообщений: 4
|
|
| 10.06.2009, 21:06 [ТС] | |
|
2Evg: обязательно завтра копну fenv.h!
По поводу long double... Тоесть, если в стандарте C или C++ он есть, то в реализации этих стандартов на определенных архитектурах их может и не быть? Я удовлетворился своим решением, это упражнение из книги по С++ Страуструпа. : ). Да и на видну его натянуть можно... Тут получаеться кроссплатформенным, но только к linux привязано... Про fenv.h я даже и не знал... теперь буду знать, спасибо большое! Раз через это можно еще и флаги состояния FPU смотреть. Зы: (в коде) а там это, разве не #include <fenv.h> надо, вместо кавычек, и int из main"а вернуть? Если Вы скажите, что gcc не ругнулся, то я очень сильно удивлюсь... В любом случае код тоже завтра опробую. Ребят, обоим большое спасибо!
0
|
|
|
|
||||
| 10.06.2009, 21:28 | ||||
|
Твой вариант скорее всего не будет правильно работать со всякими NaN'ами, INF'ами и прочей ерундой. Я не специалист в этой области, а потому какой-то пример подогнать затрудняюсь. Опять-таки если не забуду, тряхану специалистов. Есть ли какой-то "стандартный" способ для этих деяний - хз. Кстати, у тебя 0 помножить на число вроде бы как неправильно отработает Добавить надобно"return 0" просто забыл, но в этом случае компилятор обычно выдаёт warning, а не ошибку
1
|
||||
|
UNIX-way
712 / 495 / 49
Регистрация: 15.01.2009
Сообщений: 1,720
|
||
| 11.06.2009, 09:04 | ||
|
0
|
||
|
UNIX-way
712 / 495 / 49
Регистрация: 15.01.2009
Сообщений: 1,720
|
|||||||
| 11.06.2009, 16:27 | |||||||
1
|
|||||||
|
0 / 0 / 0
Регистрация: 10.06.2009
Сообщений: 4
|
|
| 11.06.2009, 16:40 [ТС] | |
|
2Evg: касательно return'а из main(): gcc таки выдает варнинг, но только если ему скормить -Wall!!! : ( Я удивлен и опечален. Да, и про 0 на число множить/делить... действительно протупил! Спасибо большое!, уже исправил код.
А про реализацию long double как double тоже что-то... протупил ![]() 2Delphin_KKC: я нигде в литературе не встречал того, чтобы "include.h" искали после текущего каталога в системном и не встречал, чтоб <include.h> искалось после систеного в текущем каталоге... если можно, скажите где я могу про это прочитать, пожалуйста. Что касаеться fenv.h, то в нем, в начале, написано: This file is part of the GNU C Library. Поэтому, даже незнаю что говорить про кросплатформенность/мультиосьность... Хотя Delphin_KKC показал нам, что в винде работает. Даже незнаю, что и думать.
0
|
|
|
UNIX-way
712 / 495 / 49
Регистрация: 15.01.2009
Сообщений: 1,720
|
|
| 11.06.2009, 16:48 | |
|
0
|
|
|
UNIX-way
712 / 495 / 49
Регистрация: 15.01.2009
Сообщений: 1,720
|
||||||||||||
| 11.06.2009, 18:22 | ||||||||||||
|
У Кернигана и Ритчи написано что "зависит от реализации". Только что проверял на DevCPP Это оригинальный код:
А теперь я закинул в папку с проэктом пустой файлик с именем "fenv.h". Код компилироваться отказался и выскочило куча ошибок по поводу что функция не определена. После того, как я заменил "#include "fenv.h" " на это:
0
|
||||||||||||
|
|
|||||||||||
| 11.06.2009, 19:46 | |||||||||||
|
Что касается gcc, то по умолчанию для кавычек и угловых скобок он ищет по одним и тем же путям:
Ну и ещё одно отличие gcc между кавычками и скобками - скобки считаются системными каталогами, а потому по файлам, подключенным через скобки подавляются warning'и
0
|
|||||||||||
| 11.06.2009, 19:46 | |
|
Помогаю со студенческими работами здесь
17
Проверка double на переполнение Проверка double на NaN и Infinity Проверка числа типа double на чётность/нечётность Проверка на корректность ввода типа double и float Почему мы пишем double x (double y)? а не через запятую double x,y Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|