2010-07-26 3 views
2

Длинный двойной, как известно, использует 80 бит.Типы данных в C

2^80 = 1208925819614629174706176;

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

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

я получаю предупреждение говоря: постоянная Integer является слишком большим для своего типа.

+4

Попробуйте использовать длинный двойной литерал вместо ... – Cogwheel

+1

из-за сохранения чисел с плавающей запятой (мантисса + экспонента), вычисление 2^80-1 не даст вам максимального количества, которое оно может сохранить. На самом деле это не даст вам ничего актуального. – rmeador

ответ

15

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

+1

Ах, избили меня к нему +1 – Marcin

+0

длинный длинный длинный длинный? –

+0

@ Крис, если это число действительно 2^80, оно точно соответствует любому типу с плавающей точкой, даже 32-битовому поплавку. –

2

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

5

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

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

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

Смежные вопросы