Что такое inf в c
Множество значений, представимых в типах float, double и long double кроме обычных конечных значений содержит три специальных значения NaN, -Inf, Inf.
Значение NaN
Значение NaN (Not-a-Number) используется для того, чтобы сигнализировать о том, что результат некоторой операции не может быть вычислен из-за неопределенностей различного рода.
Например, операция 0.0/0.0 даст результатом NaN.
На самом деле в вещественных типах представимо целое семейство значений NaN, дополнительная информация о конкретном NaN-значении может быть использована как код ошибки.
Все функции перевода из строкового представления в вещественное значение, такие как *scanf, strtod и т. п. распознают строку NAN (независимо от регистра букв) и возвращают значение NaN.
Все функции перевода из вещественного значения в строковое представление, такие как *printf распознают значение NaN и выводят его в виде строки nan.
Результат операции с числами с плавающей точкой, такой как сложение, умножение и т. д. равен NaN, если один из аргументов операции равен NaN.
Если один из операндов операции сравнения равен NaN, операции сравнения дают следующий результат:
== | 0 |
!= | 1 |
< | 0 |
<= | 0 |
> | 0 |
>= | 0 |
Чтобы проверить вещественное значение на принадлежность к классу NaN можно использовать функции fpclassify или isnan.
В силу свойств значения NaN мы будем полагать, что последовательность чисел с плавающей точкой не может быть упорядочена, если в ней содержится элемент NaN
Значения -Inf, Inf
Эти значения представляют результат "бесконечность" который может возникать при выполнениях различных операций с плавающей точкой.
Например, 1.0/0.0 дает результат Inf, а -1.0/0.0 дает результат -Inf.
Все функции перевода из строкового представления в вещественное значение, такие как *scanf, strtod и т. п. распознают строку [+|-]INF (независимо от регистра букв) и возвращают значение Inf с соответствующим знаком.
Все функции перевода из вещественного значения в строковое представление, такие как *printf распознают значение Inf и выводят его в виде строки inf с соответствующим знаком.
Значения Inf, -Inf в операциях сравнения ведут себя естественным образом, например, следующие условия истинны:
Значение Inf больше любого конечного значения, а значение -Inf меньше любого конечного значения.
Однако, обратите внимание, что Так как inf - inf дает в результате NaN.
Чтобы проверить вещественное значение на принадлежность к классу Inf можно использовать функции fpclassify или isinf.
Отрицательный 0
Множество значений вещественных чисел содержит два нуля: положительный и отрицательный. Когда в результате некоторых вычислений (например, при умножении или делении) получается нулевой результат, его знак вычисляется по обычным правилам и сохраняется. Поэтому в результате может получиться как обычное значение 0.0, так и отрицательное -0.0. Эти значения равны друг другу и, соответственно, больше всех отрицательных чисел и меньше всех положительных чисел.
Если при операции деления делитель равен нулю, то его знак учитывается при вычислении знака получающейся бесконечности. Таким образом, 1.0/-0.0 == -inf, -1.0/-0.0 == inf.
Число с плавающей запятой — inf, но целое число не является инфой в xCode Зачем?
Вероятно, это какой-то основной вопрос. Но я не могу понять это и найти ответ.
Как я знаю, что самое высокое число для int является: -2147483648
И когда я превышаю этот предел, компилятор всегда показывает мне это самое высокое значение.
И для float его: 3.4e+38 (или минус, но это не главное)
И когда я превышаю этот предел для float, компилятор показывает мне всегда inf , Почему бы и нет 3.4e+38 или же -3.4e-38 .
Другие решения
inf обозначает значение, которое больше, чем может содержать соответствующий тип с плавающей запятой. Так что, если самое высокое значение для float является 3.4e+38 , затем 3.4 * pow(10, 39) больше (обратите внимание на 39 ), такой что float будет представлять это значение как специальное значение inf , Если вы напишите, однако, 3.4 * pow(10, 38) , вы получите (почти) самое высокое значение.
Фактические самые высокие (и самые низкие) числа представлены в <limits> :
Это позволяет избежать целочисленных переполнений, которые вы получите в своем коде a += pow(2, i) , Обратите внимание, что целочисленное переполнение является неопределенным поведением и — даже если оно часто работает «как задумано» — совсем не гарантировано. В соответствии с пунктом 5/4 стандарта C ++ 11 (в отношении любого выражения в целом):
Если во время вычисления выражения результат не
математически определены или нет в диапазоне представимых значений для
его тип, поведение не определено. […]
Целые числа обычно не имеют «бесконечности» для какого-либо другого помеченного состояния. У них просто есть ценности. То, что вы делаете здесь, используя степени 2, это установка битов в 1 один за другим, имея int быть 32-битным. Это означает, что в итоге вы получите значение, которое как дополнение к двум является наименьшим значением, которое может иметь подписанное int. Если бы значение было без знака, оно было бы наибольшим. Если вы добавите к 32-битному значению значение со всеми нулями в младших 32 битах, то ничего не изменится. Таким образом, вы в конечном итоге с этим значением.
(IEEE) значения с плавающей точкой работают по-разному. У них есть флаги, обозначающие бесконечность, а не число и т. Д. Поэтому имеет смысл использовать их, когда значение выходит за пределы. Вот почему вы получаете inf, когда добавляете слишком много чисел, и значение выходит за границы.
Если вы продолжите добавлять 1 к переменной int, вы увидите, что она не останется ни в одном отдельном значении. Это переполнится и продолжит идти. Я не уверен, насколько спецификация C ++ определяет, как они должны обрабатываться, так что она может даже зависеть от реализации, но обычно значения переполняются и продолжают существовать вечно.
Что такое inf в c
SlavicG → Codeforces Round #799 (Div. 4)
ibraGYM → How to choose university?
awoo → Educational Codeforces Round 130 [рейтинговый для Div. 2]
ezraft → rip 400+ day streak
Contesting_pov → How to activate tex commands in my browser
ciara → give 1 problem i can't think
ciara → help .
Flavanoid → GNU G++ Problems
spiritedExit0 → help needed with finding a recurrence for the number of ways to fill grid
kamack38 → My GitHub
BiNARy__Beast__ → How Is o(n^2) accepted for problem C(n <= 1e5)?
eng3zim → Is beethoven97 a hacking bot?!
Erering → Why am I not getting rating even though I solved a question in a competition?
r1ddle → Getting Accpted in C++20 but TLE in C++17 With Same Code
n0sk1ll → Editorial for Codeforces Round #798 (Div. 2)
don0thing → Your daily routine!
Svlad_Cjelli → Using Rust for programming contests
Nil_paracetamol → All Div-4 Contest link
chenjb → XXII Open Cup: GP of EDG
pushpavel → (AutoCp) Competitive Programming Plugin for Intellij-Based IDEs
MrPaul_TUser → Разбор задач Codeforces Round #748 (Div.3)
Flavanoid → GNU G++ Problems
ldyllic → Facebоok (Meta) Hacker Cup 2022
YouKn0wWho → Congruence Shortest Path Problem
sachinjaiswal → TLE or Not
Блог пользователя difask
Автор difask, 7 лет назад , перевод,
Всем привет! Несколько дней назад я узнал об одной очень крутой фишке в С++. Многие кфщики используют макрос "#define INF 100000007". Вместо этого можно просто писать INFINITY и это будет работать как максимальное число в текущем типе. Например:
ll ans = INFINITY; //long_long_max
if (smth < INFINITY) //int_max by default
if (smth < (long long)INFINITY) //long_long_max
Я не видел это в кодах. Возможно кому-то это будет интересно и он начнет это использовать
с++, gnu, макросы, фишки, трюки, никто не читает тэги