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