Типы данных в C - PullRequest
       34

Типы данных в C

2 голосов
/ 27 июля 2010

Известно, что длинный дубль использует 80 бит.

2 ^ 80 = 1208925819614629174706176;

Почему при объявлении такой переменной, как:

    long double a = 1208925819614629174706175; // 2^80 - 1

появляется предупреждение: целочисленная константа слишком велика для ее типа.

Ответы [ 3 ]

15 голосов
/ 27 июля 2010

1208925819614629174706175 - это целое число, а не двойное число. Ваша программа с радостью преобразует его, но сначала оно должно быть действительным целым числом. Вместо этого используйте длинный двойной литерал: 1208925819614629174706175.0L.

5 голосов
/ 27 июля 2010

Во-первых, неизвестно, сколько бит используется типом long double. Это зависит от реализации.

Во-вторых, то, что какой-то тип с плавающей запятой использует определенное количество битов, не означает, что этот тип может точно представлять целочисленное значение, используя все эти биты (если это то, что вы хотите). Типы с плавающей точкой называются типами с плавающей точкой, потому что они представляют нецелые значения, что обычно подразумевает нетривиальное внутреннее представление. Из-за специфики этого представления только часть этих битов может использоваться для фактических цифр номера. Это означает, что ваш номер 2^80 - 1 будет усечен / округлен тем или иным способом. Поэтому, независимо от того, как вы это делаете, не удивляйтесь, если компилятор предупредит вас о потере данных.

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

2 голосов
/ 27 июля 2010

Значение 1208925819614629174706175 сначала создается как const int, а затем, когда присваивание происходит, преобразуется в long double.

...