Ale*_*and 2 c double types long-integer
已知长双倍使用80位.
2 ^ 80 = 1208925819614629174706176;
为什么,在声明变量时,例如:
long double a = 1208925819614629174706175; // 2^80 - 1
Run Code Online (Sandbox Code Playgroud)
我得到一个警告说:整数常数对于它的类型来说太大了.
Tho*_*ith 15
1208925819614629174706175
是整数文字,而不是双精度.你的程序很乐意转换它,但它必须首先是一个有效的整数.相反,使用long double literal : 1208925819614629174706175.0L
.
首先,不知道一个long double
类型使用了多少位.这取决于实施.
其次,仅仅因为某些浮点类型使用某些特定数量的位,并不意味着此类型可以使用所有这些位精确地表示整数值(如果这是您想要的).浮点类型称为浮点类型,因为它们表示非整数值,这通常意味着非平凡的内部表示.由于该表示的细节,这些比特中只有一部分可用于该数字的实际数字.这意味着您的2^80 - 1
号码将以某种方式被截断/舍入.因此,无论您如何操作,如果编译器警告您数据丢失,请不要感到惊讶.
第三,正如其他答案已经注意到的那样,你在程序文本中使用的常量是一个整数常量.对该常量施加的限制与浮点类型完全无关.使用浮点常量而不是整数常量.