C ++ gcc大数错误

时间:2015-08-05 04:34:36

标签: c++ gcc double

我的c ++项目需要处理行星质量的数量......超过24位数。它们是花车。相同的变量也可能是一个相对较小的数字(100)我尝试过使用double,而且很长,但在linux中使用G ++进行编译我收到警告:警告:

整数常量对于其类型[默认启用]而言太大。

此外,我的计算也不起作用。我想知道这种数字需要什么类型的变量。

我已经做过研究,但是它变得干涩......但是,如果这个问题经常发生,我很抱歉。谢谢!

3 个答案:

答案 0 :(得分:3)

如果您有一段代码:

double mass = 31415926535892718281828459;

然后您需要了解常量是一个整数。整个声明会在将其放入double之前将其变为mass,但您的方案在之前

你需要告诉编译器它是一个双重直接的东西,如:

double mass = 31415926535892718281828459.0;

C++11的第2.14节详细说明了文字及其定义方式。第一部分不是0的一组数字由以下2.14.2 Integer literals部分规则捕获:

decimal-literal:
    nonzero-digit
    decimal-literal digit

(以0开头的一组数字仍然是一个整数,只有一个由八进制数字而不是十进制数字组成。)

部分2.14.4 Floating literals显示如何指示编译器您想要double,例如:

  • 包括1.41415.中的小数部分;或
  • 使用12e2中的指数表示法。

或者,那里的语言律师:

  

浮动文字由整数部分,小数点,小数部分,e或E,可选的有符号整数指数和可选的类型后缀组成。整数和分数部分都由一系列十进制(十进制)数字组成。可以省略整数部分或小数部分(不是两者);小数点或字母e(或E)和指数(不是两者)都可以省略。

     

浮点文字的类型是double,除非后缀明确指定。后缀f和F指定float,后缀l和L指定long double。

答案 1 :(得分:2)

你需要确保它是双倍的:

123456789012345678   // integer, give warning
123456789012345678.0 // double (floating point)

如果您需要额外的精度,则应考虑使用大量库。另请参阅C++ library for big float numbers

答案 2 :(得分:2)

这是一个产生此警告的简单测试用例:

float foo() {
  return 1000000000000000000000000;
}

问题是那里写的数字实际上是一个整数字面值。此代码基本上是"将此值视为int,将其转换为float,并返回该值。"但这个数字太大而不适合int

解决方案:添加" .0"或" .0f"在数字的末尾,使其成为doublefloat字面而不是int