如何避免大数字的科学记数法?

时间:2008-11-05 14:23:32

标签: c++ math

我正在做2 ^ 1000而且我得到了这个:

1.07151e + 301

有没有办法在不使用e + 301的情况下将其转换为正确的数字,或者至少有人能告诉我在哪里可以看到如何将其转换为实数,通过某种方式使用e + 301部分?

9 个答案:

答案 0 :(得分:13)

在机器寄存器中可以直接操作的数字的大小有一个实际限制。如果使用双精度浮点数,则总共有64位,其中一些用于尾数,一些用于指数,一些用于符号位。

2 ^ 1000需要表示1001位整数而不会丢失精度。为了使用这样的数字,您需要使用具有大量支持的库,例如GNU MP

答案 1 :(得分:10)

您需要使用专为长号设计的数字类。

要将2 ^ 1000表示为精确数字,那么根据定义,您需要一个实际上包含1001个二进制位的数字格式。最长的正常原始整数格式通常只有64位。

顺便说一下,答案是:

% perl -Mbigint -e 'print 2**1000'
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

答案 2 :(得分:10)

所以,我认为你真正想要的只是能够在没有科学记数的情况下打印它。如果你正在使用printf,你想要的是:

printf( "%f1000.0", value );
// note that 1000 is way larger than need be,
// I'm just too lazy to count the digits

使用cout,尝试类似:

cout.setf(ios::fixed);
cout << setprecision(0) << value;

如果你想以2的力量打印它(2 ^ 1000 vs 10715 ...),你可以自己动手。

答案 3 :(得分:4)

如果你想在C ++中自己做,你可以创建一个数字数组并自己进行计算。经过测试和验证的例子:

unsigned int result[400]; // result digits
unsigned int i, j, carry;

// Initialize result digits
for (i = 0; i < 399; i++) {
  result[i] = 0;
}
result[399] = 2;

for (i = 2; i <= 1000; i++) { // Calculate 2^i
  carry = 0;
  for (j = 399; j > 0; j--) {
    result[j] <<= 1;    // multiply with 2
    result[j] += carry; // add carry
    carry = result[j] / 10;
    result[j] %= 10;    // we want one digit (0-9) only
  }
}

printf("2 ^ 1000 = ");
// print result digits
for (i = 0; i < 400; i++) {
  if (result[i] != 0) { // no leading zeros, please
    for (j = i; j < 400; j++) {
      printf("%d", result[j]);
    }
    break;
  }
}
printf("\n");

答案 4 :(得分:2)

cout&lt;&lt;固定&lt;&lt; your_number;

但它可能不会显示整数。正如有人之前所说,你需要写一堂课。

答案 5 :(得分:2)

一个选项,如果您的应用程序逻辑允许更改您正在操作的单位....

如果您是以埃为单位测量从纽约到巴黎的距离,请选择里程或公里数.... 除了纯粹的数学要求之外,(比如将密码学的素数分解,或者对Reimann假设进行研究),很少需要保留那么多数字的准确性。

另一方面,如果你正在做一些需要完全准确的整数值和那么多数字的东西,那么你应该得到专门用来处理大数字的软件......这样的软件肯定是可用的,虽然我不是熟悉那个地区。 (成本,供应商,能力等) 如果成本是一个问题,并且您正在考虑编写自己的问题,那么我不了解所涉及的内容,以了解该方法是否值得付出努力......

答案 6 :(得分:0)

您可以获得与变量类型可支持的数字一样精确的数字。该数字大约为1,后跟301个零。要获得一个精确的数字,你必须使用支持大数字的库,或使用为这种数学(maple,matlab等)制作的语言

答案 7 :(得分:0)

我面临着同样的问题。我试图直接打印2^34,结果是 3.43597e+010

您应该考虑将其存储在变量中,因为这解决了我的问题。例如,

long long int a= pow(2,34)-2;
cout<<a;

正如我想要的那样,输出是一个实数-34359738366

答案 8 :(得分:-1)

包括标题limits.hcmath.h

cout.precision(0);
cout<< fixed<< pow(2,31);               //OR ANY NUMBER HERE

使用cout.precision设置精度。