据我所知,float可以精确地表示14个数字。
所以让我们假设我们有
a = 564214623154
b = 54252我们将这个c=a*b相乘,它应该是30609771735350808,但当编译它时,它显示3.0609771735351E+16,所以据我所知,它应该会失去一些精度,但当我用c除以c/a时,我得到了564214623154的准确结果,而没有任何精度损失
再举一个例子,假设我们有
c = 30609771735350808
d = 30609761111111111e=c-d应为10624239697,但在编译时显示为10624239696,因此会丢失精度
那么,只有当我减去或相加两个数字时,精度才会丢失吗?
如果重要的话,我使用php
发布于 2011-07-13 06:25:08
使用乘法和除法也有可能失去精度。PHP和JavaScript以IEEE754格式存储数字,尾数为52位,指数为11位。有些整数是精确表示的,有些则不是。
让我们试试这些:
在Real Math中(用Ruby生成):
45345657434523 * 9347287748322342 / 74387422372 = 5697991604786167788在PHP和JavaScript中
45345657434523 * 9347287748322342 / 74387422372 = 5697991604786168000所以我们也会损失乘法和除法的精确度。
编辑:在重新讨论OP的问题时,这似乎不是一个很好的答案,因为结果包含超过15个十进制数字的精度。如果问题的目的是将一组数字相乘和相除,其中每个数字都以15位或更少的精度表示,那么最终结果往往会保持很高的精度(前提是您不会溢出或下溢)。所以你可以将1.25E35 * 2.5E7相乘,得到精确的3.125e+42,因为PHP和JavaScript基本上会将有效数字的组相乘,并将指数相加。但是,如果将这两个值相加,则会得到1.25E35 + 2.5E7 = 1.25E35。没错,你给一个数字加上2500万,它就不会改变!这是因为,正如操作员所说,您只能获得14或15位小数位的精度。尝试通过写出120000000000000000000000000000000000 + 25000000来手动添加这两个值。14-15位数字从左边开始计数,你不能把它们都拿起来。
底线是精度问题更有可能与加法和减法一起出现。很高兴知道这一点。
发布于 2011-07-13 06:29:37
在第一种情况下,您不会损失精度,PHP只是将较大的数字格式化为浮点数。(在内部,该数字保留为浮点数。)试试这个,得到“精确”的输出:
$a = 564214623154;
$b = 54252;
$c = $a * $b;
printf("%u, %u\n", $c, $c/$a);接下来,在c * d的情况下,您的两个数字已经超过了标准的IEEE-64位浮点数的容量( 53位,而您至少需要55位),所以当您存储这些数字时,精度已经丢失。
在加/减过程中失去精度的问题被称为“取消”:你花了所有存储空间的所有最重要的位都被取消了,最终你得到的位没有足够的准确位来填充manitssa。这就是生活。
想象一下,你坐在月球上,在英国伍斯特对你弟弟的胡须头发长度进行了两次测量。比较这两个测量值会影响您存储大量精度的需求。
https://stackoverflow.com/questions/6671853
复制相似问题