C и бесконечность размер переменной - PullRequest
1 голос
/ 06 августа 2010

Как переменная за пределами размера "unsigned long long" представлена ​​в Си или любом другом языкеЕсть ли тип переменной для представления бесконечности?

Ответы [ 4 ]

3 голосов
/ 06 августа 2010

Оба числа с плавающей точкой и числа с двойными числами имеют представление для бесконечности. Интегральные типы не имеют этой способности, встроенной в язык, но, если вам это нужно, есть приемы, которые можно использовать для назначения INT_MAX или LONG_MAX из limits.h для этой цели.

Конечно, чтобы сделать это, вы должны иметь полный контроль над вычислениями - вы не хотите, чтобы регулярные вычисления заканчивались этим значением и затем обрабатывались как бесконечность.

Для чисел, больших, чем те, которые могут быть представлены нативными типами, вы можете обратиться к математической библиотеке произвольной точности, такой как GMP .

3 голосов
/ 06 августа 2010
2 голосов
/ 06 августа 2010

Вы говорите о представлении числа бесконечности или работе с числами, слишком большими, чтобы поместиться в один собственный тип данных?Для последнего возможно создать структуры данных, которые представляют большие числа, и написать свою собственную логику, чтобы реализовать арифметику для этих структур.

Я сделал это на базовом уровне для некоторых проблем на Project Euler .Мой подход состоял в том, чтобы расширить алгоритмы, используемые в начальной школе, которые позволяют вам выполнять операции с многозначными числами, разбивая их на операции с использованием только однозначных чисел плюс некоторое ношение, остатки, заимствования и т. Д.

Вы также можете быть заинтересованы в этой статье Википедии об арифметике произвольной точности .

0 голосов
/ 06 августа 2010

unsigned long long - это самый большой из стандартных целочисленных типов языка Си, он должен иметь возможность представлять не менее 2 64 - 1. В стандарте С нет целочисленного типа, который должен представлять значения, превышающие этот,Некоторые реализации могут предлагать больший тип в качестве расширения, но вы не можете на него полагаться.

test.c:3: error: ‘long long long’ is too long for GCC

Стандартные целочисленные типы не могут представлять бесконечность, если вы не выделите для этой цели определенный битовый шаблон (например, ULLONG_MAX).Я думаю, что типы с плавающей точкой имеют представления для бесконечности.Вы можете проверить, является ли тип с плавающей запятой бесконечностью с помощью стандартного макроса C isinf, и вы можете установить тип с плавающей запятой на бесконечность с помощью макроса INFINITY.Я думаю, что Стандарт C не требует, чтобы типы с плавающей запятой могли представлять положительную и отрицательную бесконечность.

...