реклама на сайте
подробности

 
 
> Как проверить, что число не превысило ULLONG_MAX?
ViKo
сообщение Apr 7 2018, 12:25
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Допустим, в макрофункции производятся некие вычисления - умножение, деление. И ее результат должен быть больше нуля и меньше или равным 2 ^32.
Как задать параметры макрофункции, чтобы гарантировать, что компилятор при расчетах не вышел за пределы unsigned long long? Если их несколько.
Задачу для ограничений результатов могу так сделать:
(FUN > UINT_MAX) ? UINT_MAX : (FUN > 0 ? FUN : 1)
А проверку внутри макрофункции? Наверное, никак?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
HardEgor
сообщение Apr 7 2018, 12:36
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(ViKo @ Apr 7 2018, 19:25) *
А проверку внутри макрофункции? Наверное, никак?

Для одной или двух переменных еще выгодно проверять входящие, если больше - то дешевле вычислить с большей разрядностью, потому что надо проверять все комбинации границ значений.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 7 2018, 12:37
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(HardEgor @ Apr 7 2018, 15:36) *
Для одной или двух переменных еще выгодно проверять входящие, если больше - то дешевле вычислить с большей разрядностью, потому что надо проверять все комбинации границ значений.

Так и хочу, потому и использую ULL. Но как этот предел проверить?
У меня 3 переменных.
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Apr 7 2018, 12:47
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Для каждого выражения свои.
Например х*y/z - чтобы не вышли за 64бита, достаточно чтобы все значения были не более 32 бита
а если х*y*z и значения 32 бита - чтобы не вышли за 64бита, надо контролировать чтобы сумма разрядности чисел не превысила 64, можно логарифмы сложить.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 06:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01406 секунд с 7
ELECTRONIX ©2004-2016