我正在做2 ^ 1000而且我得到了这个:
1.07151e + 301
有没有办法在不使用e + 301的情况下将其转换为正确的数字,或者至少有人能告诉我在哪里可以看到如何将其转换为实数,通过某种方式使用e + 301部分?
答案 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.h
和cmath.h
cout.precision(0);
cout<< fixed<< pow(2,31); //OR ANY NUMBER HERE
使用cout.precision设置精度。