c++ pow(2,1000)对于双倍来说是正常的,但它是有效的。为什么?
因此,我已经学习C++几个星期了,但是数据类型仍然让我感到困惑。
首先,一个小问题是: 0xbadc0de在另一个线程中发布的代码不适合我。首先pow(2,1000)给了我this more than once instance of overloaded function "pow" matches the argument list.
我通过更改pow(2,1000) -> pow(2.0,1000)修复了它,运行它并得到如下结果:
http://i.stack.imgur.com/bbRat.png
而不是
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376它失去了很多的价值,可能是什么原因呢?
但现在是真正的问题。我想知道302个数字长的数字如何适合双(8个字节)?0xFFFFFFFFFFFFFFFFFFFF= 18446744073709551616,那么这个数字怎么会比这个更大呢?
我想这和浮点数编码有关。另外,如果不是0xFFFFFFFFFFFFFFFFFFFFFFFF,可以以8字节存储的最大数字是什么?
发布于 2013-01-28 17:07:42
八个字节包含64位信息,因此您可以使用这些位来存储2^64 ~ 10^20唯一项。这些项可以很容易地解释为从0到2^64 - 1的整数。因此,您不能以8字节存储302位十进制数字;0和10^303 - 1之间的大多数数字不能这样表示。
浮点数可以保持接近302个小数位的数字;这是因为它们分别存储尾数和指数。这个表示法中的数字存储一定数量的有效数字(如果我没记错的话,双倍数为15-16)和一个指数(可以进入数百个内存服务)。但是,如果小数是X字节长,那么它只能区分2^(8X)不同的值.不太可能准确地表示带有302位小数的整数。
要表示这样的数字,您必须使用更多的位:实际上大约是1000字节或125字节。
发布于 2013-01-28 17:06:24
这叫做“浮点”是有原因的。数据类型包含一个标准意义上的数字,以及一个表示小数点所属位置的指数。这就是pow(2.0, 1000)工作的原因,也是你看到很多零的原因。浮点数(或双,也就是更大的浮点数)数字包含固定数量的精度数字。所有剩余的数字最终都是零。尝试pow(2.0, -1000),您将看到相同的情况反过来。
浮点数(32位)的精度小数位数约为7,而双(64位)的小数位数约为16小数位。
现在大多数系统都使用IEEE浮点,我只是链接到了一个非常好的描述。另外,本文还对具体标准IEEE 754-1985给出了不同大小浮点数位布局的详细描述。
发布于 2013-01-28 17:10:48
浮点类型可以覆盖比相同大小的整数类型大得多的范围,但精度较低。
它们所代表的数字如下:
s;m,1到2之间的值,给出一定数量的精度;e。值本身计算为m * pow(2,e),如果设置了符号位,则为负值。
一个double有一个53位尾数,它提供了大约16位小数的精度.
因此,如果您需要表示一个精度超过64位的整数,那么64位整数和64位浮点类型都不能工作。您将需要一个大的整数类型,需要尽可能多的位来表示您正在使用的值,或者(取决于您要解决的问题)其他一些表示形式,比如素因式分解。在标准的C++中没有这样的类型,所以您需要自己制作。
https://stackoverflow.com/questions/14567127
复制相似问题